随笔分类 -  动态规划

Bribe the Prisoners
摘要:这个题来自Codejam的Round 1C 2009 的C题。题意:连续编号i..j个牢房,每个牢房最初住着一个犯人。释放犯人k时,需要bribe犯人k两边的犯人,直到遇见空牢房或者边界。输入,是一个释放犯人序列。求,最小 bribe的金币。和最优二叉查找树差不多的DP。找到中间那个划分点,把问题分为两个子问题。显然构成最优子结构。/* 动态规划 cost(i, j) = min{cost(i, k) + cost(k, j) + pos[j] - pos[i] -2} , i < k < j */#include <stdio.h>#include <limit 阅读全文
posted @ 2011-05-28 19:15 yongmou- 阅读(675) 评论(0) 推荐(1) 编辑
LCA与RMQ
摘要:参见topcoder的算法教程,Range Minimum Query and Lowest Common AncestorJOJ 一个题目:2408 Beautiful girl, 题意:一颗树,给定三个顶点A、B、C,判断A与B之间的路径是否可以经过C代码:代码 阅读全文
posted @ 2010-08-15 20:36 yongmou- 阅读(412) 评论(0) 推荐(0) 编辑
POJ 2336 Ferry Loading II 动态规划
摘要:题意:一个渡河问题,船每次最多可以载n辆车,单程渡河的时间是t,有m辆车要渡河,问最少时间把所有车运过河去的时间是多少,这个情况下,最少的运输次数是多少。分析:确实是动态规划,惭愧我想了很久,也没想出状态转移方程,主要是因为我一直想把过河时间和次数放在一起表示状态,其实,过河时间做状态就行了,也必须只用过河时间做状态,因为要求的是过河时间的最小值。dp[i]表示第i辆车通过河的最小时间, trip... 阅读全文
posted @ 2010-08-01 08:19 yongmou- 阅读(1183) 评论(0) 推荐(0) 编辑
树型动态规划
摘要:树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺推与逆推,而树型动态规划是建立在树上的,所以也相应的有二个方向:  1.根—>叶:不过这种动态规划在实际的问题中运用的不多,也没有比较明显的例题,所以不在今天讨论的范围之内。  2.叶->... 阅读全文
posted @ 2010-07-30 10:38 yongmou- 阅读(1017) 评论(0) 推荐(0) 编辑
POJ 1745 Divisibility 很好的DP题
摘要:题意:n个整数中间填上+或者-,运算结果能否被k整除。1<=n<=10000, 2<=k<=100思路:虽然不是最优化问题,但确实是DP,刚开始我也没想起了怎么DP。可以把结果mod k看作状态,这样虽然n个数有2^n-1种运算方式,但结果只有k种,所以只需枚举这k个数即可。f(i, j) 表示 前i个数运算结果mod k是否存在余数j,转移方程就简单了:如果f( i-1,... 阅读全文
posted @ 2010-07-13 03:57 yongmou- 阅读(723) 评论(0) 推荐(0) 编辑
JOJ 2412 Divide the finger
摘要:题意:把一个不超过16位的数字分成m份,求乘积最大值。一个例子:12345拆成两部分,1234|5、123|45......,但是最大值是1234 * 5 = 6170思路:动态规划,f(i, j, t)表示数字的第i位到j位,拆成t部分的最大值。方程:f(i, j, t) = max { f(i, k, 1) * f(k+1, j, t-1) } , k = i..(j-t+1) ;即, t份的... 阅读全文
posted @ 2010-07-12 00:30 yongmou- 阅读(322) 评论(0) 推荐(0) 编辑
最长上升子序列
摘要:最长上升子序列问题:给出一个由n个数组成的序列x[1..n],找出它的最长单调上升子序列。即求最大的m和a1,a2……,am,使得a1<a2<……<am且x[a1]<x[a2]<……<x[am]。动态规划求解思路分析:(O(n^2))经典的O(n^2)的动态规划算法,设A[i]表... 阅读全文
posted @ 2010-07-11 21:20 yongmou- 阅读(5592) 评论(0) 推荐(2) 编辑
UVa 10131 Is Bigger Smarter? 最长公共子序列
摘要:题意:给出不超过1000头大象的(重量,IQ),其中重量之间可能有相同的,IQ之间也可能有相同的,寻找重量严格递增,IQ严格递减的序列,输出其长度,和序列,序列以输入数据中的序号表示。思路:第一步:对这些大象按照重量排序,排序时,只对索引排序就可以了,不需要动大象的实际数据,比如(600,300,400),对应索引是(1, 2,3)排序后是(2, 3,1)。   第二步:对IQ排序,这需要消去重复... 阅读全文
posted @ 2010-07-10 10:00 yongmou- 阅读(826) 评论(2) 推荐(0) 编辑
UVa 624 CD && joj 1387 CD 背包问题
摘要:题意很简单:n个东西,装入容量为c的背包,怎么使装的东西重量和最大。其实,就是价值等于重量的0/1背包问题。  UVa 上规模比较小n最大值是20, 用DP把最大容量设置大点就可以AC,但是JOJ上n最大值是100,又没有告诉容量最大有多大,用DP一用就Runtime Error,在设置大点就Memory Limit Exceeded,只好用DFS搜索了。  DFS搜索的剪枝还挺有技巧性的,其实,... 阅读全文
posted @ 2010-07-09 00:07 yongmou- 阅读(665) 评论(0) 推荐(0) 编辑
POJ 1159 Palindrome
摘要:题意:插入字符来得到回文串,求插入字符最小数目思路:递归方程dp[i][j], 下来三者的最小值:如果str[i] 等于 str[j] 时 dp[i+1][j-1]; dp[i+1][j] + 1(在str[j]后面插入一个与str[i]相同的字符); dp[i][j-1] +1(在str[i]前面插入一个与str[j]相同的字符)。子问题填表,从(0,0)到(n, n)对角线向上填。代码:[代码... 阅读全文
posted @ 2010-07-08 23:44 yongmou- 阅读(387) 评论(0) 推荐(0) 编辑
POJ 1088 滑雪
摘要:题意:在二维数组中找最长的下降序列,可以向上、下、左、右,四个方向走思路:len[i][j] = max{上,下,左,右},还需要考虑height[i][j]与上下左右的关系。  这个方程的子问题填表方式有两种:一是,迭代方式,用一个结构体记录height[i][j]、i、j,然后对高度排序,然后从小到大填表,这样就能保证填len[i][j]时,其上下左右如果不比   height[i][j]大则... 阅读全文
posted @ 2010-07-08 23:21 yongmou- 阅读(227) 评论(0) 推荐(0) 编辑
POJ 1080 Human Gene Functions (类似于编辑距离)
摘要:题意:计算两个DNA碱基序列的相似度,可以插入空格来匹配任一个碱基,题目中给了任意匹配的代价。思路:score[i][j]为下列三者的最大值:seq1[i]与seq2[j]匹配 + score[i-1][j-1];空格与seq1[i]匹配 + score[i-1][j];空格与seq2[j]匹配 + score[i][j-1]。初值,score,第一列表示一直用空格匹配第一个序列,第一行表示一直用... 阅读全文
posted @ 2010-07-08 22:52 yongmou- 阅读(267) 评论(0) 推荐(0) 编辑
POJ 1050 To the Max(最大子段)
摘要:题意很简单:求一个矩阵中子矩阵元素和的最大值。  思路:穷举任意两行,对这两行的列和求最大子段。最大子段递归方程:s[k] = (s[k-1]>0) ? (s[k-1]+ a[k]) : a[k]。s[k]表示以a[k]结尾的最大子段和,方程式的意思是,如果s[k-1]>0则以a[k]结尾的最大子段包括前面的子段,否则以a[k]结尾的最大子段就是它本身。 代码:[代码] while (... 阅读全文
posted @ 2010-07-08 22:27 yongmou- 阅读(440) 评论(0) 推荐(0) 编辑