hdu4597 Play Game 区间DP
题目链接: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的更多相关文章
- hdu4597 区间dp
//Accepted 1784 KB 78 ms //区间dp //dp[l1][r1][l2][r2] 表示a数列从l1到r1,b数列从l2到r2能得到的最大分值 // #include <c ...
- 【BZOJ-4380】Myjnie 区间DP
4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
- HDU5900 QSC and Master(区间DP + 最小费用最大流)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...
- 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 ...
- 区间dp总结篇
前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...
随机推荐
- bootstrap-dialog插件的使用
官网文档:http://nakupanda.github.io/bootstrap3-dialog BootstrapDialog.show({ message: 'Hi Apple!', messa ...
- oracle习题1~13
1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录. 4. 查询Score表中成绩在 ...
- 手机自动化测试:Appium源码分析之跟踪代码分析七
手机自动化测试:Appium源码分析之跟踪代码分析七 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest推出手机自 ...
- CSS如何实现圆角的outline效果?
一.首先,outline是个很牛逼的东西 温故而知鑫,10年的时候写过一篇可用性方面的文章:“页面可用性之outline轮廓外框的一些研究”,还算挺有用的:3年之后,也就是13年,介绍了个没什么使用价 ...
- POI 3.8读取2003与2007格式EXCEL(xls、xlsx)
废话少说直接上代码,记得是poi3.8版本啊.方法入口唯一,自动判断格式,使用接口引用,自动选择执行方法. 方法入口: public static ArrayList<String[]> ...
- Android查看stdout 和stderr
在默认状态下,Android系统有stdout和stderr(System.out和System.err)输出到/dev/null,在运 行Dalvik VM的进程中,有一个系统可以备份日志文 ...
- 进入html+css世界的正确姿势
今天,我带大家一起走进html+css的世界. HTML其实是HyperText Markup Language的缩写, 超文本标记语言.他是用于告诉浏览器这是一个网页, 也就是说告诉浏览器我是一个H ...
- 你说你精通CSS,真的吗?
以前做项目的时候,学习了HTML和CSS,感觉这两个比较简单,在W3school里学习了一下之后,就觉得自己已经没问题了.可是,真正要做一个好看的页面,我还是要写好久.其实,对于CSS,我并没有像我以 ...
- .Net 官方学习文档
.Net 官方学习文档:https://docs.microsoft.com/zh-cn/dotnet/articles/welcome
- 用Rvm安装Ruby,Rails运行环境及常见错误解决方法
一.安装Rvm 1.下载安装Rvm $ curl -L https://get.rvm.io | bash -s stable 此时可能出现错误:"gpg: 无法检查签名:找不到公钥&quo ...