算法:hdu 4597 Play Game(区间dp)

题意

Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个

只能从其中一个序 列,选择两端中的一个拿走。他们都希望可以拿到尽量大

的数字之和,并且他们都足够聪明,每次都选择 最优策略。Alice先选择,问

最终Alice拿到的数字总和是多少?

思路

这题应该算是区间dp吧, 可以看一下这题的原型:

其他规则都一样,但是只有一个数字序列,也是每次只能拿左右两端的一个数字 ,问最终Alice拿多少? (这个可以去做uva-10891)

只有一行数字序列可以用f(i, j)表示数字序列还剩下 区间[i,j]段时开始拿,最多可以拿多少数字

而这题只是变成了两行数字序列, 那么可以在上面的基 础上,再增加两维

变成f(i, j, k, l), 表示第一个序列剩下区间[i,j],第二个序列剩下区间[k,l]的情 况下开始拿,最多可以拿多少?

当面临状态f(i, j, k, l) 时,你有四种选择:

1. 选择第一行的最左 边数字

2. 选择第一行的最右边数字

3. 选择第二行的最左边数字

4. 选择第二行的最右边数字

所 以, f(i, j, k, l)可以由:

f(i+1, j, k, l)

f(i, j-1, k, l)

f(i, j, k+1, l)

f(i, j, k, l-1)

这四种状态转移而来,

假设当前状态是Alice要选择,那么上一个状态就是Bob选择的最大值,

为了要让Alice的最终和最大,那么就要选择上面四种状态最小的一个转,

设sum(i, j, k, l) 表示地一 个序列[i,j]段之和与第二个序列的[k,l]段之和的和。

sum(i, j, k, l)  - 上一次Bob拿的值 就等于Alice能拿到的值

f(i, j, k, l) = sum(i, j, k, l) -

min{

f(i+1, j, k, l)

f(i, j-1, k, l)

f(i, j, k+1, l)

f(i, j, k, l-1)

}

时间: 2024-09-23 10:24:49

算法:hdu 4597 Play Game(区间dp)的相关文章

算法:uva 10003 Cutting Sticks (区间dp)

题目大意 一根长为l的木棍,上面有n个"切点",每个点的位置为c[i] 要按照一定顺 序把每个点都砍段,最后变成了n+1段 每砍一次,就会有一个花费,例如长度为10,"切点"为2,那么砍完 后会变成两段2,8, 那么花费为2+8=10 如果有多个"切点",那么不同顺序切会得到不同的花费. 最小 花费是多少? 思路 注意要增加一个c[n] = l f(i, j) 表示(i,j)区间的最小花费 f(i, j) = min{ f(i,k)+f(k+1,

算法:uva 1351 String Compression(字符串区间dp)

题目大意 给一个字符串,可以把连续相同的部分进行缩写成k(S)的形式,S是一个字符串,k表示 有连续相同的S 例如,abgogogogo,可以缩写成ab4(go). 还可以嵌套缩写,比如 "nowletsgogogoletsgogogo", 缩写成"now2(lets3(go))" 思路 一道区间dp,但是这题并 不好想 f(i, j)表示字符串的i~j位的最小位数 那么 f(i, j) = min{  min{ f(i,k)+f(k+1, j), i<=k&

算法:uva-10304 Optimal Binary Search Tree(区间dp)

题意 给一个序列即可 S = (e1,e2,...,en),且e1<e2<..<en.要把这些序列构成一个二叉搜索 树. 二叉搜索树是具有递归性质的,且若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 值: 若它 的右子树不空,则右子树上所有结点的值均大于它的根结点的值. 因为在实际应用中,被访 问频率越高的元素,就应该越接近根节点,这样才能更加节省查找时间. 每个元素有一个访问频率f(ei) ,当元素位于深度为k的地方,那么花费cost(ei) = k. 所有节点的花费和访问

uva 10688:The Poor Giant(区间dp)

题目链接: uva-10688 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=514&page=show_problem&problem=1629 题意 有n个苹果,和一个数k,第i个苹果的重量是k+i(1<=i<=n). 已知其中只有一个苹果是甜的, 所有比它重量轻的都是苦的,比它重的都是酸的. 为了要找出甜的苹果,就要去一个一个地吃它,且吃了咬了苹果

算法:hdu 2639 Bone Collector II (dp 01背包求第k优解)

题目大意: 有n件物品,每件物品有体积和价值两个属性, 一个小偷带着一个大小为v的背包,要 偷这些东西,问小偷能偷的第k大的价值是多少? 思路: 这题和典型的01背包求最优解不同, 是要求第k大的解,所以,最直观的想法就是在01背包的基础上再增加一维,用来保存前k大小的数,然后在 递推时,根据前一个状态的前k 大小的数推出下一个阶段的前k个数保存下来. d[i][j][k], 表示取前i个物品,用j的费用,第k大价值是多少 在递推d[i][j][1...k]时,先获取上一个状态d[i- 1][j

算法:HDU 2126 Buy the souvenirs (dp 二维01背包)

题目大意: 有n(0<n<=30)件物品,每件物品的价格是Pi,要用m(0<=m<=500)块钱去 买这些物品,要求买尽量多数量的物品,问买最多数量的物品共有多少总方案? 思路: 这题 还是比较容易想到的 f[i][j][k], 表示前i个物品,用费用j,买k个物品共有多少个方案 得到 状态转移方程: f[i][j][k] += f[i-1][j-c[i]][k-1]; 初始化f[0][0][0] = 1 代码: #include<iostream> #include&

算法:hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)

题意 这是一个塔防游戏,地图是一个n个编号为1-n的节点的树, 节点1是敌人的基地,其他叶子 节点都是你的基地. 敌人的基地会源源不断地出来怪兽,为了防止敌人攻进你的基地,你可以选择造塔. 每个节点最多只能造一个塔,且节点i可以有ki种塔供你选择,价钱和攻击力分别为price_i, power_i 攻击力power_i,效果是让敌人经过这个节点时让敌人的血减少power_i点.   那么从敌人的基地到你 的任意一个基地的路径,这条路径上的所有塔的攻击力之和,就是这个基地的抵抗力. 敌人的攻击路径

算法:HDU 2196 Computer(树形dp经典)

题意: 给出一棵树,求离每个节点最远的点的距离 思路: 把无根树转化成有根树分析 , 对于上面那棵树,要求距结点 2的最长距离,那么,就需要知道以2为顶点的子树(蓝色圈起的部分,我们叫它Tree(2)),距顶点2的最 远距离L1 还有知道2的父节点1为根节点的树Tree(1)-Tree(2)部分(即红色圈起部分),距离结点1 的最长距离+dist(1,2) = L2,那么最终距离结点2最远的距离就是max{L1,L2} f[i][0],表示顶点为i 的子树的,距顶点i的最长距离 f[i][1],

算法题:UVA 348 Optimal Array Multiplication Sequence(区间dp)

Optimal Array Multiplication Sequence Given two arrays A and B, we can determine the array C = A B using the standard definition of matrix multiplication: The number of columns in the A array must be the same as the number of rows in the B array. Not