黑书DP专辑

page section no title submit
113 1.5.1 例题1 括号序列 POJ1141
116 1.5.1 例题2 棋盘分割 POJ1191
117 1.5.1 例题3 决斗 Sicily1822
117 1.5.1 例题4 “舞蹈家”怀特先生 ACM-ICPC Live Archive
119 1.5.1 例题5 积木游戏 http://202.120.80.191/problem.php?problemid=1244
123 1.5.2 例题1 方块消除 http://poj.org/problem?id=1390
123 1.5.2 例题2 公路巡逻 http://202.120.80.191/problem.php?problemid=1600
125 1.5.2 例题3 并行期望值 POJ1074
131 1.5.2 例题6 不可分解的编码 http://acmicpc-live-archive.uva.es/nuevoportal/data/problem.php?p=2475
133 1.5.2 例题7 青蛙的烦恼 http://codewaysky.sinaapp.com/problem.php?id=1014
135 1.5.2 例题9 最优排序二叉树 http://judge.noi.cn/problem?id=1059
138 1.5.2 例题10 Bugs公司 POJ1038
139 1.5.2 例题11 迷宫统计 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=70&page=show_problem&problem=1472
142 1.5.2 例题12 贪吃的九头龙 http://judge.noi.cn/problem?id=1043
151 1.5.3 问题2 最长上升子序列问题 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=17&page=show_problem&problem=1475
151 1.5.3 问题3 最优二分检索树 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=15&page=show_problem&problem=1245
152 1.5.3 问题4 任务调度问题 POJ1180
121 1.5.1 1.5.8 艺术馆的火灾 http://221.192.240.23:9088/showproblem?problem_id=1366
144 1.5.2 1.5.10 快乐的蜜月 http://judge.noi.cn/problem?id=1052
145 1.5.2 1.5.12 佳佳的筷子 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=14&page=show_problem&problem=1212
146 1.5.2 1.5.13 偷懒的工人 POJ1337
146 1.5.2 1.5.15 平板涂色 POJ1691
147 1.5.2 1.5.16 道路重建 POJ1947
147 1.5.2 1.5.17 圆和多边形 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1679
148 1.5.2 1.5.18 Jimmy落地 POJ1661
148 1.5.2 1.5.19 免费糖果 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=13&page=show_problem&problem=1059
157 1.5.3 1.5.22 回文词 POJ1159
157 1.5.3 1.5.24 邮局 POJ1160
158 1.5.3 1.5.26 奶牛转圈 POJ1946
158 1.5.3 1.5.27 元件折叠 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=14&page=show_problem&problem=1180

转载出处:http://www.cnblogs.com/vongang/archive/2012/05/03/2481308.html

貌似有的链接不能用了。。。Mark一下,过段时间刷刷dp

 

黑书上的原文:本节所有的内容都很重要,尤其是例题,决心掌握DP的读者应当话时间全部掌握。本节的难点是模型的理解,包括一些难度偏大的题目和动态规划理论中的一些问题。学习本节之后,应该对每道题目,都能在很短的时间内把思路完整的整理一遍。对于大部分题目,应当能很快的写出程序。

  这里做几个约定:1、加上每道题的提交地址。2、每道题只写转移方程和思路,不贴代码,因为我以后还要再刷。3、个人愚见,大牛无视。

1.5.1 括号序列 POJ 1141

黑书上的经典例题。dp[i][j]表示i 到j添加的最小括号数。

dp[i][j] = Min {

dp[i+1][j-1]        s[i]s[j] = “()” 或 s[i][j] = "[]"   ……………  1

dp[i][k] + dp[k + 1][j]    把s分成si...sk, sk + 1...sj  …………2

} dp[i][i] = 1;

这里对黑书上的写法做了一下简化,发现(S', [S', S'), S']这几种情况在Si...Sk, Sk + 1...Sj中已经包括了。

这题让输出匹配好的序列。。。所以纠结了。。。参考这里

思路是用pos[i][j]表示(i, j)段的拆分位置。初始是情况-1。当出现在dp[i][j] = dp[i][k] + dp[k+1][j]时,拆分位置是pos[i][j] = k。

根据pos[][] dfs输出括号序列。

1.5.1 棋盘分割 POJ 1191

难得一见的中文题。

均方差化简得 σ = ((1/n) ∑xi2) - (Δx)2 。在纸上写写,化简很简单,关键是能想到。。。已知Δx是定值,要保证σ 最小只需要保证xi2最小就可以。s(x1, y1, x2, y2)表示(x1, y1) (x2, y2)所包含的区间所有值的和。dp(k, x1, y1, x2, y2)表示(x1, y1) (x2, y2)所包含的区间加k条割线割成k + 1块所得到的最小∑xi2值。当然,分横割和竖割两种情况。转移方程:

dp(k, x1, y1, x2, y2) = {

min(dp(k-1, x1, y1, i, y2) + s(i+1, y1, x2, y2)2, dp(k-1, i+1, y1, x2, y2) + s(x1, y1, i, y2)2);    //横割

min(dp(k-1, x1, y1, x2, j) + s(x1, j+1, x2, y2)2, dp(k-1, x1, j+1, x2, y2) + s(x1, y1, x2, j)2);    //竖割

}

然后记忆化搜索。。。

ps:第一次不知道是哪地方推错了还是怎么回事,样例直接不过,又敲了一遍过掉了。

1.5.1 例题3 决斗 Spoj 196. Musketeers

还可以在这里提交

O(n^3)的思想,把x点拆成x, x + n, dp[i][j] = 1表示i和j能相遇,要保证一个人能活下来就是保证i 和i + n 能相遇。初始化dp[i][i+1] = 1;

dp[i][j] = {

1  if(dp[i][k] && dp[k][j] && (mp[i%n][k%n] || mp[j%n][k%n])  存在一个k使得i -> k,j -> k并且,i 能打败k,或者j 能打败k。

0  else

}

要注意的是必须遵循counterclockwise,所以要保证 j <= i + n, i + 1 <= k < j;


1.5.1 例题4 “舞蹈家”怀特先生

怀特先生是个大胖子,他很喜欢玩跳舞机(DDR),DDR的主要内容是用脚来踩踏板,踏板有四个方向的
箭头(如下图) 分别用1,2,3,4来代表。每首歌曲有一个箭头序列,游戏者必须按照这个序列一次用
某一只脚踩相应的踏板。在任何时候两只脚都不能在同一个踏板上但可以同时呆在中心位置


从中心移动到任何一个箭头耗费2单位体力,从任何一个箭头移动到相邻箭头耗费3单位体力,移动到相对的箭头耗费4单位体力,而留在原地再踩一下只需要1单位体力,两只脚不能同时在一个踏板上,但可以同时呆在中心板上。


总结:多阶段决策,理解无后效性的定义。这题需要注意的几点:case1、起始时双脚都在0位置;case2、1,2,3,4这几个位置不能直接踏两只脚。

首先要考虑怀特先生作出下一步决策是根据什么?这一点想到这道题就完成大半了。。。。神一般的dp啊,ym。

根据怀特先生当前双脚的位置进行转移, 设dp[x][y][k]表示应该跳第k个舞步时,左脚在x位置,右脚在y位置的最小体力耗费。移动的情况只能有如下几种:  

a) 把一只脚从中心位置移动到目标位置

b) 移动到相邻位置

c)移动到相对位置

d)在原地踩一下

dp[x][y][k] = min(dp[x][a[k]][k+1] + sum(y, a[k]), dp[a[k][y][k] + sum(x, a[k]));   //这样写已经考虑到case2了,想想为什么。^_^

sum(x, y)表示x到y消耗的体力。

最后记忆化搜索。。。

1.5.1     例题5     积木游戏

dp(i, a, b, k)表示第i堆,已经处理完a个,最上边一个是b,且b的顶面是k。判断合法的情况可以画个图看一下。

如图,写法有点搓。。。各种if。。。T_T

ps: 有一点值得注意的是,问题求的是m堆的和,也就是说我就算给他堆一堆,然后这个高度是最大的,那么这一堆就是解。(因为这一堆是可以拆的)开始时被这个纠结住了。。还到处问怎么保证分m堆,我好搓。。。。

1.5.2    例题1    方块消除

题意:n个方格,每次可以消除相同颜色的所有相邻的方格,假设一次消除L个,则得分L^2,求最大得分。(可能出现消除中间的方格后两边的方格相连)

思路:先把方格预处理一下,col[i]表示第i整块连续方格的颜色,len[i]表示长度。dp(i, j, k)表示后边k块方格的颜色和col[j]相同时,合并(col[i], len[i]), (col[i+1], len[j+1]), (col[i+2], len[i+2])...(col[j], len[j] + k) (len[j]+k表示后边有k个并到len[j]上一起消除。);

case1、k块方格的颜色跟len[j]正好相同,可以直接消除掉,dp(i, j, k) = dp(i, j - 1, 0) + (len[j] + k)^2;

case2、k快方格的颜色跟len[j]相同,并且和i...j之间某一整块p颜色相同则可以先消除dp(p + 1, j - 1, 0), 再消除dp(i, p, len[j] + k);这是一个递归的过程。

dp(i, j, k) = max(case1, case2);

在纸上画画,实现实现就清楚了。刚开始看的时候迷迷糊糊,总是不利解k表示的什么。。。T_T

因为case2中col[p] == col[j],所以可以记录一下j前边出现与j颜色相同整块的位置pre[j]。这里也算是一个小优化。

1.5.2     例题7     青蛙的烦恼

青蛙的烦恼。。。我也烦恼了!仰慕黑书。。。有的地方其实可以写的更直观的,不明白为什么书上要那样些。。。

变换后的距离要比变换前短,所以得到一个结论:从1出发第一步只能到n或者2,从2出发只能到。同样的,如果第一步是2,从2出发第一步只能到n或则3。或者说要求区间[i, j]的最优值,开始从j 出发第一步只能是j - 1或者i,同样从i出发只能是i + 1或 j 。写道这里递归就很明显了。。。

dp(i, j, k) k  = 0表示从i点出发,[i, j]中的点访问一次所得到的最小距离,k = 1表示从j  点出发,[i, j] 中的点访问一次所得到的最小距离。

k = 0 : dp(i, j, k) = MIN(dis(i, i + 1) + dp(i + 1, j, 0),  dis(i, j) + dp(i + 1, j, 1));

k = 1 : dp(i, j, k) = MIN(dis(j, j - 1) + dp(i, j - 1, 1), dis(j, i) + dp(i, j - 1, 0));

ans = min(dp(0, n - 1, 0), dp(0, n - 1, 1));

 

转载出处:http://www.cnblogs.com/vongang/archive/2012/05/06/2485690.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值