题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597

全国邀请赛通化赛区第8题--题目重现

思路:

区间DP的思想,想法是队友想出来的,感觉很秒,自己处理的边界,果断AC

边界处理很重要!!

对于两列牌。我们定义f[x][y][k][h]表示对于当前状态中第一列牌处于区间(i,j),第二列牌处于区间(k,h)时,先手(即当前要选择牌的选手)和后手之间的最大差值

定义sum1[x][y][k][h]表示先手的在此区间的获得的分数的最大值,sum2[x][y][k][h]表示后手在此区间的获得的分数的最大值

那么如果对于当前的区间,当前的选手选择y位置的牌,那么f[x][y][k][h]=(sum1[x][y-1][k][h]+a[y]-sum2[x][y-1][k][h]);

又很容易知道sum1[x][y-1][k][h]-sum2[x][y-1][k][h]=-f[x][y-1][k][h];

为什么是负的呢??很简单,因为上一次的先手是对方啊

同理,也可以选择x,k,h位置的牌

那么我们最终可以得到这样一个简单的DP转移方程

f[x][y][k][h]=max(-dfs(x,y-1,k,h)+a[y],-dfs(x+1,y,k,h)+a[x],-dfs(x,y,k+1,h)+b[k],-dfs(x,y,k,h-1)+b[h]);

状态方程有了,实现的时候最重要的就是边界处理了。

我用的是记忆化搜索的方式

代码:

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include<iostream>
using namespace std;
#define N 22
#define INF 999999999
int f[N][N][N][N], a[N], b[N], sum[][N];
bool vis[N][N][N][N];
int n;
int dfs(int i, int j, int k , int h)
{
int &x = f[i][j][k][h];
if(vis[i][j][k][h]) return x;
vis[i][j][k][h] = true;
x=-INF;
if(k==&&h==&&i==&&j==) return x=;
else
if(k==&&h== && i==j) return x=a[i];
else
if(i==&&j== && k==h) return x=b[k];
else
if(k==&&h==) x=max(max(-dfs(i+,j,,)+a[i],-dfs(i,j-,,)+a[j]),x);
else
if(i==&&j==) x=max(max(-dfs(,,k+,h)+b[k],-dfs(,,k,h-)+b[h]),x);
else
if(i==j && k!=h) x=max(max(max(-dfs(,,k,h)+a[i],-dfs(i,j,k+,h)+b[k]),-dfs(i,j,k,h-)+b[h]),x);
else
if(k==h && i!=j) x=max(max(max(-dfs(i,j,,)+b[k],-dfs(i+,j,k,h)+a[i]),-dfs(i,j-,k,h)+a[j]),x);
else
if(i==j&& k==h) x=max(x,max(-dfs(,,k,h)+a[i],-dfs(i,j,,)+b[k]));
else
{
x= max(x, max(-dfs(i, j-, k, h) + a[j], -dfs(i+, j, k, h) + a[i]));
x = max(x, max(-dfs(i, j, k, h-) + b[h], -dfs(i, j, k+, h) + b[k]));
} return x;
}
int main()
{
int cases;
scanf("%d", &cases);
while(cases--) {
scanf("%d", &n);
int sum=;
for(int i = ; i <= n; i++) scanf("%d", &a[i]),sum+=a[i];
for(int i = ; i <= n; i++) scanf("%d", &b[i]),sum+=b[i];
memset(vis, false, sizeof(vis));
int res = dfs(, n, , n);
cout<<(sum+res)/<<endl;
}
return ;
}

hdu4597 Play Game 区间DP的更多相关文章

  1. hdu4597 区间dp

    //Accepted 1784 KB 78 ms //区间dp //dp[l1][r1][l2][r2] 表示a数列从l1到r1,b数列从l2到r2能得到的最大分值 // #include <c ...

  2. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  3. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  4. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  5. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  6. poj2955 Brackets (区间dp)

    题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...

  7. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  8. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  9. 区间dp总结篇

    前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...

随机推荐

  1. WebService客户端添加SOAPHeader信息

    通过JAXBContext创建Marshaller对头信息进行解析为dom,获取WSBindingProvider,使用Headers.creat()创建soap的Header元素: 另外就是:将us ...

  2. java与xml之间的转换(jaxb)

    使用java提供的JAXB来实现java到xml之间的转换,先创建两个持久化的类(Student和Classroom): Classroom: package com.model; public cl ...

  3. iOS开发之CALayer

    1.         概述 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView,其实UIView之所以能显示在屏幕 ...

  4. python学习之路-书籍推荐

    学python有一段时间了,总结走来的路,发现还是看书靠谱,当然也要多实践. 一.入门篇 1.简明 Python 教程(A Byte of python) http://www.kuqin.com/a ...

  5. 学习CSS了解单位em和px的区别

    这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章,题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后确实收获很大.平时都是用p ...

  6. webpack引入handlebars报错'You must pass a string or Handlebars AST to Handlebars.compile'

    背景: webpack作为一个部分替代打包工具和模块化工具的优秀选择出现,作为尝试,也为了构建自己习惯的前端开发方式,我尝试了将webpack和自己常用handlebars模板引擎结合.整体项目背景为 ...

  7. 模块化规范Common.js,AMD,CMD

    随着网站规模的不断扩大,嵌入网页中的javascript代码越来越大,开发过程中存在大量问题,如:协同开发,代码复用,大量文件引入,命名冲突,文件依赖. 模块化编程称为迫切的需求. 所谓的模块,就是实 ...

  8. Servlet实现的三种方式

    实现Servlet的三种方式:一个实现,两个继承 /*========================================== * servlet的执行过程: * 1.创建servlet对 ...

  9. js求三位数的和

    例如输入508就输出5+0+8的和13: <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  10. 深入hibernate的三种状态

    学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别 ...