² 博弈取牌—记忆化搜索

题目描述:

有两副带有数字的牌,(数字>0)两人轮流取,取中了某张牌,自己的分数就加上牌上的数字,但只能从两端取,每人都会用最优的策略使得自己的分数最高。问A先取,他能得到的最高的分数。

解法:

记忆化搜索,对于第一、二副牌的左右端点分别为fr1,ta1, fr2,的情形,某个人能拿到的分数的最大值这次取走牌fr1,ta1,fr2,ta2中的最大值,牌的数目减1,问题规模被缩小。边界条件为当没有牌时为0。因为两个人都是这么思考,可抽象成一个人。当总分数为sum时,我能得到的分数会是sum-对手能拿到的分数。

代码实现:

int dp[N][N][N][N]; //初始值为0

int a[N],b[N];//记录第一副牌和第二副牌

//sum的初始值为总值

int dfs(int fr1,int ta1,int fr2,int ta2,int sum)

{

if(fr1>ta1 && fr2>ta2) return 0;

if(dp[fr1][ta1][fr2][ta2]) return dp[fr1][ta1][fr2][ta2];//已经被搜到过

int m =0;    //以下是四种决策

if(fr1 <= ta1)

{//总的钱数-对手能拿到的最多的钱数,下同

m = max(m,sum-dfs(fr1+1,ta1,fr2,ta2,sum-a[fr1]));

m = max(m,sum-dfs(fr1,ta1-1,fr2,ta2,sum-a[ta1]));

}

if(fr2 <= ta2)

{

m = max(m,sum-dfs(fr1,ta1,fr2+1,ta2,sum-b[fr2]));

m = max(m,sum-dfs(fr1,ta1,fr2,ta2-1,sum-b[ta2]));

}

return dp[fr1][ta1][fr2][ta2] = m;

}

HDU 4597 记忆化搜索的更多相关文章

  1. Hdu 4597记忆化搜索

    好久没有做题了,水平已经完全在学弟之下了. 一个吉林邀请赛最水的题目.:( 其实这题一看到数据范围,只可以想到思路,直接爆搜,加个记忆化. 这题虽然A了,但是我还是没太想清楚一些边界情况,心虚着A了. ...

  2. hdu 4722(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 思路:简单的记忆化搜索,留意一下A==0时的情况就可以了. #include<iostre ...

  3. hdu 1514 记忆化搜索

    题意是给4堆(堆的高度小于等于40)有颜色(颜色的种类小于等于20)的物品,你有一个篮子最多能装5件物品,每次从这4堆物品里面任取一件物品放进篮子里,但是取每堆物品时,必须先取上面的物品,才能取下面的 ...

  4. hdu 1208 记忆化搜索

    题目大意:只能按照格子上的数字*方向走,从左上走到右下Sample Input42331121312313110Sample Output3 直接记忆化搜索,注意是0的情况 #include<c ...

  5. hdu 4960 记忆化搜索 DP

    Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Ot ...

  6. hdu 2089 记忆化搜索写法(数位dp)

    /* 记忆化搜索,第二维判断是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi ...

  7. HDU 1978 记忆化搜索(dfs+dp)

    Y - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  8. hdu 1078(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 //dp[i][j]表示从点i,j处开始能获得的最多cheese #include <io ...

  9. hdu 1978 记忆化搜索

    注意: dp[i][j] 表示(i,j)这个点有多少种方式       mark[i][j]表示这个点是否走过  假设有直接返回dp[i][j]    dp的求法为全部梦走到点的dp的和 注意mark ...

随机推荐

  1. ASP.NET MVC 4使用Bundle的打包压缩JS/CSS

    打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载多个文件案才能完成网页显示的延迟感,同时通过移除JS/CSS ...

  2. Flexbox

    使用 Flexbox 的牛逼布局 .container { display: -webkit-flex; display: flex; } .initial { -webkit-flex: initi ...

  3. html中offsetTop、clientTop、scrollTop、offsetTop

    HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对 ...

  4. webview上传图片

    import java.io.File; import android.annotation.SuppressLint;import android.app.Activity;import andro ...

  5. init()和deinit()

    一.初始化方法(init()) 1.定义:类初始化对象时所调用的方法 2.分类: (1)默认初始化方法 (2)便利初始化方法 (3)使用闭包 3.一些注意点: (1)方法固定名为init,没有返回值, ...

  6. hdu 2048

    PS:WA了两次...主要是没注意到fac的大小好像只能写到9...要用long long型递归求阶乘... 然后就是错排公式...百度下.. 代码: #include "stdio.h&q ...

  7. 迪士尼黑科技:爬墙机器人 VertiGo

    12 月 30 日,迪士尼研发出的一款爬墙机器人曝光了一段有趣的视频.从视频里可看出这个机器人碰到墙壁时迅速地作出反应爬了上去. 据了解,这个爬墙机器人名叫 VertiGo,由迪士尼研究中心和苏黎世联 ...

  8. UILabel自适应宽度的函数详解

    之前用Text Kit写Reader的时候,在分页时要计算一段文本的尺寸大小,之前使用了NSString类的sizeWithFont:constrainedToSize:lineBreakMode:方 ...

  9. UITouch的用法

    UITouch一般无法直接获取,是通过UIView的touchesBegan等函数获得. //这四个方法是UIResponder中得方法 // Generally, all responders wh ...

  10. YII2.0中实现高级注册

    如何在不修改逻辑代码的情况下完美解决以上三个问题?看了下面的教程,一目了然! 以高级版2.0.6为例,打开/frontend/models/SignupForm.php class SignupFor ...