题目链接: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. AutoMapper.RegExtension[.NET Core版本] 介绍

    Technorati 标签: AutoMapper.RegExtension,AutoMapper.RegExtension .NET CORE AutoMapper.RegExtension 为一个 ...

  2. 开源 & 在线免费使用:升讯威 周报系统

    这个周报系统大约写于2015年,缘起当时所带的开发团队需要逐步建立或完善一些项目管理方法. 在调研了网上的诸多项目管理或周报/日报管理系统之后,并没有找到符合当时情况的系统,这里最大的问题不是网上既有 ...

  3. 数位dp初步——数位dp的两种方式

    数位dp:一类统计区间[L,R]内某种符合规定的数字个数的题目.特征是R的范围会很大,O(N)范围内无法完成. 一般而言,解决这类题目有两种方式,一种是递推,另一种是记忆化搜索. 递推: 1)利用dp ...

  4. 自适应滤波:奇异值分解SVD

    作者:桂. 时间:2017-04-03  19:41:26 链接:http://www.cnblogs.com/xingshansi/p/6661230.html 声明:欢迎被转载,不过记得注明出处哦 ...

  5. JavaScript高级程序设计---学习笔记(二)

    面向对象程序设计1.属性类型.定义多属性.读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为.这些特性是为了实现JavaScript引擎用的,因此不能直 ...

  6. 关于WdatePicker.js的结束时间大于开始时间

    简单笔记 : WdatePicker.js 要使结束时间大于开始时间只要在线束时间的 minDate:'#F{$dp.$D(\'stimeParam\')}' 即可:不多说 详细代码如下: <t ...

  7. java开发中经典的三大框架SSH

    首先我们要明白什么是框架为什么用?相信一开始学习编程的时候都会听到什么.什么框架之类的:首先框架是一个软件半成品,都会预先实现一些通用功能,使用框架直接应用这些通用功能而不用重新实现,所以大多数企业都 ...

  8. java 基础知识五 数组

    java  基础知识五  数组 数组保存的是一组有顺序的.具有相同类型的数据. 同一个数组中所有数据元素的数据类型都是相同的. 可以通过数组下标来访问数组,数据元素根据下标的顺序,在内存中按顺序存放 ...

  9. idea + mybatis generator + maven 插件使用

    idea + mybatis generator + maven 插件使用 采用的是 generator 的 maven 插件的方式 ~ 1 pom.xml mybatis其它配置一样,下面是配置my ...

  10. 使用 ItextSharp HTML生成Pdf(C#)

    以前生成pdf的时候.因为生成的pdf数据是固定的,所以先做好pdf模板,动态的数据可以先用占位符 生成的时候.找到占位符坐标.把数据填充进去 优点:先做好模板.生成的pdf 表格.文.内容会好看一些 ...