2013 吉林通化邀请赛 Play Game 记忆化搜索
dp[ba][ta][bb][tb]表示a堆牌从下面拿了ba张,从上面拿了ta张。b堆牌从下面拿了bb张,从上面拿了tb张。当前玩家能得到的最大的分数。
扩展方式有4种,ba+1,ta+1,bb+1,tb+1,用当前剩下牌的总分减掉它,取最大值,就是当前玩家的最高分。
记忆化搜索
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int a[30];
int b[30];
int sum;
int dp[21][21][21][21],n,maxn;
inline int cal_max(int a,int b,int c)
{
return max(max(a,b),c);
}
int dfs(int ba,int ta,int bb,int tb,int sums)
{
if(ba+ta==n&&bb+tb==n) return 0;
if(dp[ba][ta][bb][tb]) return dp[ba][ta][bb][tb];
int maxn=0;
if(ba+ta<n)
{
maxn=cal_max(maxn,sums-dfs(ba+1,ta,bb,tb,sums-a[ba+1]),sums-dfs(ba,ta+1,bb,tb,sums-a[n-ta]));
}
if(bb+tb<n)
{
maxn=cal_max(maxn,sums-dfs(ba,ta,bb+1,tb,sums-b[bb+1]),sums-dfs(ba,ta,bb,tb+1,sums-b[n-tb]));
}
dp[ba][ta][bb][tb]=maxn;
return maxn;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
sum=0;
scanf("%d",&n);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
sum+=b[i];
}
printf("%d\n",dfs(0,0,0,0,sum));
}
return 0;
}
2013 吉林通化邀请赛 Play Game 记忆化搜索的更多相关文章
- 2013 吉林通化邀请赛 D-City 离线型的并查集
		题意:给定n个点和m条边,问你拆掉前i条边后,整个图的连同城市的数量. i从1到m. 思路:计算连通的城市,很容易想到并查集,但是题目里是拆边,所以我们可以反向去做. 存下拆边的信息,从后往前建边. ... 
- 2013 吉林通化邀请赛 Tutor 有点坑的水题
		计算12个数的和的平均数.四舍五入,不能有后导0. 我的做法是,将答案算出后,乘以1000,然后看个位是否大于等于5,判断是否要进位…… #include<iostream> #inclu ... 
- HDU 4597 Play Game (DP,记忆化搜索)
		Play Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total S ... 
- HDU 4597 Play Game (记忆化搜索博弈DP)
		题意 给出2*n个数,分两列放置,每列n个,现在alice和bob两个人依次从任意一列的对头或队尾哪一个数,alice先拿,且两个人都想拿最多,问alice最后能拿到数字总和的最大值是多少. 思路 4 ... 
- HDU 1142 A Walk Through the Forest (记忆化搜索 最短路)
		A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ... 
- hdu 4628 Pieces(状态压缩+记忆化搜索)
		Pieces Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ... 
- POJ 1191 记忆化搜索
		(我是不会告诉你我是抄的http://www.cnblogs.com/scau20110726/archive/2013/02/27/2936050.html这个人的) 一开始没有想到要化一下方差的式 ... 
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
		1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ... 
- 【BZOJ-3895】取石子       记忆化搜索 + 博弈
		3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ... 
随机推荐
- SOLR搭建企业搜索平台
			一. SOLR搭建企业搜索平台 运行环境: 运行容器:Tomcat6.0.20 Solr版本:apache-solr-1.4.0 分词器:mmseg4j-1.6.2 词库:sogou-dic ... 
- vld(Visual Leak Detector) 内存泄露检测工具
			初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题.当程序越来越复 杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问题.内存 ... 
- Koa -- 基于 Node.js 平台的下一代 web 开发框架
			http://koa.bootcss.com/ 多研究点 react 和 nodejs 这个是未来 
- 【免费讲座IX算法第一阶段】转专业找CS工作“打狗棒法”
			个人经验CS不相干,如何收拾简历?如何获取知识,在最短的时间内找到一份工作需要?如何避免盲目刷称号,迅速制定学习计划?如何准备面试? 星期五.九算法黄蓉老师受邀嘉宾 [在线共享] 她成功转专业的六个月 ... 
- 两张图解读Java异常与断言
			两张图解读Java异常与断言 --转载请注明出处:coder-pig 本节引言: 前天公布的"七张图解析Java多线程&quo ... 
- <转载>CSS解决图片过大撑破DIV的方法
			DIV+CSS网页内容中如果插入大于DIV层宽度显示,过大的图片将会撑破网页宽度显示从而网页严重变形,您是否遇到过?这里DIVCSS5给大家介绍几种解决图片撑破撑开网页DIV层方法. 图片撑破宽度解决 ... 
- 双向DFS模板题
			B. Book of Evil time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ... 
- linux公社的大了免费在线android资料
			2011年linux数据库的android在线分享 linux公社:开源公社 本文撰写:杨凯专属频道 2011年9月12日 21:39 <目录> Android 3 ... 
- 怎样使用CMenu类
			CMenu类从CObject类派生而来.为什么要使用CMenu类呢?AppWzard不是把菜单做好了吗?在资源编辑器上修改菜单不是很方便吗? 我是个vc++初学者,自从当斑竹以来,天天看贴子, ... 
- 积累的VC编程小技巧之工具条和状态条
			1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上 ... 
