动态规划
文章平均质量分 79
zhaofukai
行有不得,反求诸己
展开
-
Uva 10405 Longest Common Subsequence
<br />Difficulty: easy<br />Algorithms: Dynamic Programming<br />Source: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=16&problem=1346&mosmsg=Submission+received+with+ID+8357683<br />Solution Description: 这原创 2010-10-29 21:57:00 · 551 阅读 · 0 评论 -
10626 - Buying Coke
憋了好几天在雪哥的指点下终于过了,第一次些这样奇怪的dp……刚开始没有考虑到(10, 3 *1)可以兑换一瓶coca和一个5分硬币这种情况,以为不用动规,用贪心就行,结果老是WA,很不解,后来终于了发现这种情况。想用动规解,刚开始定义状态f[p][i][j][k]表示i个1分,j原创 2011-07-27 12:38:41 · 697 阅读 · 1 评论 -
10118 - Free Candies
动态规划问题。设f[i][j][k][l]表示篮子放第一堆i、第二堆j、第三堆k、第四堆l个蛋糕所剩的最少的蛋糕,状态转移方程有4个:f[i + 1][j][k][l] = min(f[i +1][j][k][l], max(0, f[i][j][k][l] - 1));( f[原创 2011-07-30 16:57:17 · 518 阅读 · 0 评论 -
codeforce Education Reform
这是昨晚codeforce的第三个题,没有做出来,后来听雪哥讲解,是一个dp,今天还做了好长时间。注意题目给的a与b只差小于100,这样我们可以定义状态:f[i][j][k]表示前i天,在第i天选择第j门课程布置k个练习所得到的最多的练习。我们可以用此状态来更新第i+1天原创 2011-10-15 17:39:42 · 653 阅读 · 0 评论 -
10723 - Cyborg Genes
好久没做lrj上的动归了,现在感觉每做出一道都是那么的令人兴奋。这道题搁了好长时间了,第一次记得是暑假开始不久看的,没做出来,现在终于AC了,真是不容易……动规来解,但应该怎么动?首先,先求出两个串的最长公共子序列d,然后用两个串的总长度m+n减去d得到的值就是满足题意的最短长度!(这个结论比较直观)然后,定义状态f(i, j, k)表示第一个串的前i个字符和第二个串的前j个字符满原创 2011-11-01 20:47:33 · 524 阅读 · 1 评论 -
10913 - Walking on a Grid
哈哈,又一道动归。这道题,状态可以设成两个:一个是从左上方得到的最大值,另一个是从右上方得到的最大值,状态转移也分开求。设f(l, i, j, k)表示状态,其中f(0, i, j, k)表示当前(i, j)点从左上方得到的经过k个负数格子的最大值,状态转移方程为:f(0, i, j, k,) = max(f(0, i - 1, j, k + t), f(1, i - 1, j, k原创 2011-11-02 00:17:15 · 708 阅读 · 0 评论 -
hdu 3646 Fate Stay Night
当你题目的一直WA,而且找不到错时,最好的办法是拽一个人来(不管TA懂不懂),把你的想法思路给讲一遍。讲的过程中,你那些自以为是的结论就会站不住脚,你就会反思这样到底对不对,然后差不多就能找出错误来。对于这道题目:火鸟double后的攻击力肯定比之前强,如果有足够的double,每个火鸟都double设状态:dp[i][j]表示前i个火鸟使用了j个double消灭最多的敌人数转移方程:原创 2012-08-10 14:10:21 · 708 阅读 · 0 评论 -
CF 176B Word Cut
之前没做出这道题是因为缺少自己的分析。别人给你提供了一些思路,如果你照着做下去觉得可以比较顺利,就继续;如果总觉得想不通,就及时丢掉,自己想办法做。从这个图中我们可以发现一些规律:原串不能产生原串(先不考虑原串中有重复的),能产生其他n-1个串。第0步,原串是1,其他都是0,总和sum为1;第1步:原串产生其他串1,其他串产生原串0,原串为0,其他串都为1。即原串:su原创 2012-08-10 16:13:07 · 816 阅读 · 0 评论 -
CF Spiral Maximum
这是一个好题。刚开始看没想深,没发现什么规律,感觉得直接爆,但这会超时。后来仔细想了想,奥秘就在这螺旋中。由3层螺旋的值,可以得到5层螺旋的值,依次类推,条件是中心不变,依次向外扩。那么如何由3层值得到5层值呢?假设3层值为A,扩到5层后,假设5层内的所有值的和为B,则5层螺旋的值为B-A,是不是很神奇,至于为什么是,你用笔画画就知道了,其余层数依次类推。我们可以O(n^2)的预处原创 2012-07-29 23:38:56 · 495 阅读 · 0 评论 -
[DP]HDU 4055 Number String
与排列相关的dp,但这类dp不太懂。定义状态:dp[i][j]表示长度为i,末尾为j的序列的个数。转移方程: if(s[i - 1] == 'I' || s[i - 1] == '?') dp[i][j]= sum[i - 1][j - 1]; if(s[i- 1] == 'D' || s[i - 1] == '?') dp[i][j] +原创 2012-08-21 15:39:44 · 1011 阅读 · 0 评论 -
石子合并
这是一道经典的动态规划问题。设f[i][j]表示合并第i个到第j个石子所得的最小得分,f[i][j] = min{f[i][j], f[i][k - 1] + f[k][j] + sum[j] - sum[i - 1]} (i 这道题可用平行四边形优化到O(n2),不过这个优化虽原创 2011-07-26 00:42:09 · 563 阅读 · 0 评论 -
662 - Fast Food
做这道题时没有什么想法,后来在《使用算法分析与程序设计》上看到了这道题,除了输出完全一样。看了以后,觉得自己好好想想也应该能做出来的,思维还是不够开阔。设w[i][j]表示从i到j只放一个depots的最小距离,w[i][j] = ∑|d[l] - d[(i + j) / 2]|原创 2011-07-24 13:37:23 · 444 阅读 · 0 评论 -
NUC 1041 - 数字三角形
<br />Difficulty: easy<br />Algorithms: Dynamic Programming<br />Source: http://acm.nuc.edu.cn/OJ/problem.php?pid=1041<br />Solution Description: 这是一个简单的动态规划问题。设d(i, j)表示第从(i,j)出发时能得到的最大的和(包括(i,j)本身),这样状态转移方程为:d(i, j) = a(i, j) + max{d(i + 1, j), d(i + 1,原创 2010-10-29 19:25:00 · 475 阅读 · 0 评论 -
10066 - The Twin Towers
<br />Difficulty: middle<br />Algorithms: Dynamic Programming<br />Source:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=1007<br />Description: 题目的要求是让大象的体重从小到大排,而智力从大到小排,输出这样的最长的路径,并打印路径。首先先对体重从原创 2010-11-20 23:48:00 · 673 阅读 · 1 评论 -
POJ 3267 The Cow Lexicon
定义状态:d[i]表示从i位置开始删除最少的字符使字符串可用所给的单词表示。状态转移方程:d[i] = min{d[i], d[i +1] + 1, d[s] + s - i - le},其中d[i]为len - i, d[i + 1] + 1表示当前字符删除后的最优值,d[s] + s - i - j表示从当前位置匹配单词X后的最优值, s为匹配单词X后i的位置,s为X的长度,s - i - j表示匹配单词X需要删除字符的个数。程序代码:#include #include #inclu原创 2011-05-18 15:25:00 · 478 阅读 · 0 评论 -
POJ 1745 Divisibility
<br /> 首先我们知道(a + b + c +……+ n)% k = a % k + b % k + …… + n % k,这样原来10000的氛围可以减小到100,定义状态f[i][j]表示前i个数字能够出现数字j,状态转移方程:若f[i - 1][j]为真,则f[i][(j - 100 + Digit[i]) % k + 100] = 1; f[i][(j - 100 - Digit[i]) % k + 100] = 1;最后判断f[n - 1][100]是否为真。注意第一个数字前边不能原创 2011-05-17 22:42:00 · 817 阅读 · 0 评论 -
POJ 1837 Balance
<br /> 自己的动归很弱,就找了个分类来做。这道题是上边列的第一道背包问题,可我看了半天也没想法,状态定义不出来,后边的就更不要想了……后来看了别人的思路,动归做的太少了……<br /> 定义状态:f[i][j]表示前i个砝码,平衡度为j的挂法的数量,状态转移方程为:f[i][j]=∑(f[i-1][j - pos[k] * weight[i]), k=1~C, j=0~7500, i=1~20。初始状态 f[0][3750]=1 表示不用物体时,平衡度为0有一种挂法。为什么是37原创 2011-05-17 20:39:00 · 392 阅读 · 0 评论 -
10029 - Edit Step Ladders
这道题目题意很清晰,也很容易想到一个O(n2)的算法,但是n有25000, O(n2)算法会超时。我的同学告诉我曾跟我说过O(n*logn*2*26*16)的算法,之前一直没做,今天在多次WA之后,终于AC了。我们这样考虑:一个单词(假设长度为16)由其他的单词经过删除,添加,替原创 2011-07-23 15:15:17 · 700 阅读 · 0 评论 -
10201 - Adventures in Moving - Part IV
现在做动归还是没有什么思路,基本靠“蒙”,先假设状态,然后再去找状态转移方程,最后再修修补补。今天能做出这道题来感觉还是很兴奋的。定义状态:f[i][j]表示在第i距离处车里还剩j升油所需的最小花费,如果能后到达终点,答案就是f[length][100];状态转移方程:f[i][原创 2011-07-23 17:52:30 · 589 阅读 · 0 评论 -
10564 - Paths through the Hourglass
#include #include #include using namespace std;#define LL long longconst int INF = (1<<29);LL f[41][22][502], d[41][22][502], weg[41][原创 2011-07-24 00:51:23 · 423 阅读 · 0 评论 -
usaco - Raucous Rockers
用动态规划求解,设w[i][j]表示从i到j用一张光盘最多刻多少首歌,可用0-1背包求出;f[i][j]表示前j首歌用i个光盘最多刻多少首歌,状态转移方程:f[i][j] = max(f[i - 1][l] + w[l + 1][j]) (i - 1 662-Fast Food非原创 2011-07-24 14:05:28 · 1151 阅读 · 1 评论 -
[基于树的点分治]POJ 2114
这道题目和楼教男人八题中的Tree差不多。只不过那到题目求小于k的个数,而这道题目求是否存在等于k。具体做法也是类似,点分治。在QZC的《分治算法在树的路径问题中的应用》中有讲解,不过大牛们的思路跳跃比较大,讲的比较简单,具体可参考这篇文章。首先理解“树的重心”,然后如何分治,如何去重,最后如何O(n)的求点对。理解复杂度为N*log2N,还是重在理解。在这道题中注意:如果A[i]原创 2012-09-06 15:39:30 · 2780 阅读 · 0 评论