page | section | no | title | submit |
113 | 1.5.1 | 例题1 | 括号序列 | |
116 | 1.5.1 | 例题2 | 棋盘分割 | |
117 | 1.5.1 | 例题3 | 决斗 | |
117 | 1.5.1 | 例题4 | “舞蹈家”怀特先生 | |
119 | 1.5.1 | 例题5 | 积木游戏 | |
123 | 1.5.2 | 例题1 | 方块消除 | |
123 | 1.5.2 | 例题2 | 公路巡逻 | |
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 | 青蛙的烦恼 | |
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 |
现在开始训练一下DP:
递归动机的DP:
pku 1141
黑书上讲的第一个题目,题意就给出一个括号序列,包含有"(" ")" "[" "]" 求最少添加的括号数是的最终的序列是合法的并输出这个序列。
思路:
首先这里求解的话要使用递归的思路,这是动态规划产生的第一种动机,于是我们可以写出记忆化搜索。进行求解。
dp[l][r] = min(dp[l][r],dp[l + 1][r - 1])如果s[l]与s[r]匹配的话。
否则我们就将该序列分成两段分别求解(这也是求解DP线性模型的一种递归分解思路)
dp[l][r] = min(dp[l][r],dp[l][k] + dp[k + 1][r])
这里关键是怎么讲可行解输出呢?开始我是通过比较dp[l][r] 与 dp[l + 1][r -1] dp[l][k] + dp[k + 1][r]来判断的后来发现这样不对的 如果dp[l + 1][r - 1] = dp[l][k] + dp[k + 1][r]的话就会出现错误,而我们这里dp[l][r]确实从dp[l][k] + dp[k + 1][r]来的。所以,我们要另开一个二维数组记录每种最优状态的来源点。然后再递归的输出即可。
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include
pku 1191
思路:
棋盘横着切竖着切,然后递归将棋盘不断缩小到能够求解的状态。记忆化搜索。这里中间计算值可能会超0x7f7f7f7f,所以最大值取大一点。这里让哥条了很长时间。。
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include
sicily 1822
题意:黑书
思路:
开始吧题意理解错了,一位如果判断i必须从i开始一次与i + 1,i +2比较呢。SB了。。
dp[i][j]表示i能否与j相遇,记住这里是相遇不表示i与j谁能打败谁。如果判断x点,我们把x点查分为x与n + 1,这样讲原来的环转化成连,然后求x与n +1是否能够相遇即可
dp[i][j] = (dp[i][k] && dp[k][j] && (mat[i][k],mat[j][k])),mat[i][j]表示i能否打败j
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include
hdu 3632
题意:
这题和上题目意思一样,只不过这里是序列1-n然后每个人可以选择左右两边的人进行对决,我刚开始看到这题目的时候,就以为是上边那道题目,结果样例过了,就是不对。
思路:
这里某个人i如果能够胜出,那么他一定能够和0点并且和n + 1点相遇。(与上题一样,抽象出来的两个点)。然后我们只要枚举任意两点是否能够相遇即可,
dp[i][j] = (dp[i][k] && dp[k][j] && (mat[i][k],mat[j][k])),mat[i][j]表示i能否打败j, 这里根据i到j的距离进行递推的。
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include
题意:看给书吧..
思路:
我们考虑的是最后一段是单独消去还是和前边的一起消去,这样就可以构造出递归的递推式了。
题目的方块可以表示称color[i],len[i],1<=i<=l这里l表示有多少"段"不同的颜色方块color[i]表示第i段的颜色,len[i]表示第i段的方块长度让f[i,j,k]表示把(color[i],len[i]),(color[i+1],len[i+1]),...,(color[j-1],len[j-1]),(color[j],len[j]+k)合并的最大得分考虑(color[j],len[j]+k)这一段,要不马上消掉,要不和前面的若干段一起消掉1.如果马上消掉,就是f[i,j-1,0]+(len[j]+k)^22.如果和前面的若干段一起消,可以假设这"若干段"中最后一段是p,则此时的得分是f[i,p,k+len[j]]+f[p+1,j-1,0]于是f[i,j,k] = max{ f[i,j-1,0]+(len[j]+k)^2, f[i,p,k+len[j]]+f[p+1,j-1,0]
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include
多决策动机的DP:
题意:黑书。。
思路:
这里每一步要么走左腿,要么走右腿,要么原地不动。DFS求解肯定超时,因为状态数太多,所以我们只好利用DP记录所有状态,然后通过每一步的决策。求解所有满足条件的状态。
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include
题意:。。。
思路:
就是按着黑书上的第一种思路做的,这里有个地方卡了一下, 就是j表示的类成了j堆,在枚举的时候不能只到m-1否则最后累到第m的堆的最后一个也就不存在了,。
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include
思路:
dp[i][j]表示到达在时间为j时第i个关口与巡逻车相遇的最少次数 dp[i + 1][j + 1] = max(dp[i + 1][j + 1],dp[i][j] + s); s表示目标车在 [j, j + k]时间段内从第i个关口出发到i + 1个关口与巡逻车相遇的次数。
其实状态转移很好想,只是在车辆相遇上脑子短路了,我们只要排除不相遇的就好了。
这里还没有优化。。
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include
===================================================================
poj 1337
题意:
一个懒工人,他想工作的时间尽量少。有N个任务,每个任务有开始时间和deadline,工人完成这个工作需要ti时间。如果某个时刻有工作可以做(这里是说,如果从这个时刻开始某个工作,在deadline之前能够完成),那么这个工人必须做,但是如果这个时刻存在着多余1件工作可以做,工人可以选择;假设这个时刻没有工作可以做了,工人就可以偷懒直到有新的任务到来
思路:
刚开始以为只要我一空下来有工作,我就必须从这一点开始工作来着,其实不是的,只要在最晚期限之前完成该工作即可。
dp[i]表示在时间点i时,完成工作所需要的最少时间,dp[i + 1] = min(dp[i + 1],dp[i])当该时间没有工作干时,当有多个工作时,dp[i + tk] = min(dp[i + tk],dp[i] + tk) k表示第k个工作可以再时间点i完成
这里注意inf = 0x3fffffff 因为会有inf的相加,这里快整死我了,给很长时间没有条出来。。
View Code #include #include #include #include #include #include #include #include #include #include #include #include #include