dp
文章平均质量分 74
catfishbear
acmer
展开
-
uva 1099 Sharing Chocolate
题意:给定一个面积的巧克力,能否分解成n个给定面积的巧克力。 思路:记忆话搜索,d[r][S]表示r行,面积为S(用集合表示),是否可行,注意每次搜索的时候保证可以整除,因为需要根据面积来算出列的大小。 #include #include #include #define mem(name,value) memset(name,value,sizeof(name)) #define FOR(i原创 2015-01-27 11:35:19 · 403 阅读 · 0 评论 -
uva 1394 And Then There Was One 递推
题意:格k个人删除一个,第一个删除的是第m个。 先不考虑m,按1到n编号,假设删除的是第k-1个,(数k个) 则序列 1、2、…… k-1、k、k+1……n-1、n。 之后1、2、……k-1、k+1……n。 然后从k+1开始重新编号,则成为n+1-k、n+2-k、……n-1、1……n-k。 倒着推的话,若知道在n-1次删除的为 f(n-1),则第n次应为 (f(n-1)+k)%n; 第原创 2015-01-20 11:03:36 · 348 阅读 · 1 评论 -
uva 10891 Game of Sum 区间dp
题意:有一个长度为n的整数序列,A和B轮流取左端或者右端部分,使自己得分高。 整数序列的值是一定的,所以使一个人得分越高,即是另一个人的得分越低。d(i,j)表示原序列i~j个,则d(i,j) = sum(i,j) - min{d(i+1,j),d(i+2,j)....d(j,j),d(i,j-1)...d(i,i), 0},0 表示全部取完,若直接记忆化搜索的话,O(n^3),若用递推,可以用原创 2015-01-20 11:30:25 · 294 阅读 · 0 评论 -
uva 672 Gangsters
题意:就是有N个人,有一个P值和一个S值,然后商店有一个K值,当这个人来的时候如果K和S相等,则进去,则总P加上该人的P值,每秒K可以+1或者-1或者不变。 思路:先按时间排序。d[i]表示第i个人进来总P值最大是多少。则d[i] = max(d[j], d[j]+p[i]) (t[i]-t[j] >= abs(S[i]-S[j])) ,这里要注意的就是初始化一开始所有人设为-1,d[0]=0;原创 2015-01-29 21:09:31 · 390 阅读 · 0 评论 -
uva 10163 Storage Keepers
题意:有N个仓库,让M个人守,使每个仓库安全值尽量高的同时,花费最小。 思路:如果两个一起更新的话,当安全值相等,更细花费,或者安全值更大,一起更新,这样会导致问题就是,因为题目安全值是所有值中的最小值,有可能前面其实取更下花费的人就能达到最小值,但是你前面已经更新成了较大的。 所以应该分两步,第一步,先求出能够使仓库达到的最大值,第二步,求出使每个仓库达到这个值的最小花费。 第一个状态表示原创 2015-01-29 20:53:30 · 330 阅读 · 0 评论 -
uva 1351 String Compression(dp)
题意:给一个字符串,如果其中有m个子串s0相等的话,可以表示为m(s0),然后问给定字符串最少可以表示成多少? 思路:设d[i][j]为i~j字符串最小长度是多少。则d[i][j] = min{d[i][k]+d[k][j]},还要考虑自身存在循环的子串,则枚举s0的长度,d[i][j] = min(d[i][j],d[i][i+k-1] + 2 + cal(j-i+1)/k); #inclu原创 2015-01-29 21:01:38 · 346 阅读 · 0 评论 -
uva 11552 Fewest Flops
题意:把一个字符串每k个分成一组,组内可以任意排列,然后相同字母在一起为一块,最少多少块。 思路:组内必然是一起的排一起,不用考虑,然后我们用d[i][v]表示第i块用v做最后一个字符有多少块。 用vis[i][v]表示第i块是否存在v d[i][v] = min{d[i-1][v1] + len(i) - vis[i][v1]},如果有前一块v1转移过来的时候,且第i块也存在v1则,可以减原创 2015-01-27 11:47:13 · 310 阅读 · 0 评论 -
uva 1169 Robotruck (dp)
令d[i] 为从原点出发,将前i个垃圾清理完存放垃圾桶的最小距离。 则d[i] = min{ d[j] + dist0[j+1] + dist(j+1,i) + dist0(i) | j 而我们令sumd(i) 为从0走到i的距离之和,则dist(j+1,i) 为 sumd(i) - sumd(j+1); 则d[i] = min{ d[j] + dist0[j+1] - sumd(j+1)原创 2015-01-27 10:55:00 · 420 阅读 · 0 评论 -
uva 11825 Hackers' Crackdown 集合上的dp
题意:有n台计算机n个服务,每个计算机有相关联的计算机,攻击之后,相关联的也受影响。我们只能让某一个计算机停止某一个服务,如何使尽量多的服务完全瘫痪(没有任何计算机有该服务) 就是有n个集合P1,P2....Pn,每个集合表示的与之相关联的计算机,分成尽量多的一组,使并集为全集(这样这些计算机停止一项服务就行)原创 2015-01-20 11:42:14 · 300 阅读 · 0 评论 -
uva 11404 Palindromic Subsequence
题意:求最长回文子序列,并且是最小子序列。 思路:求最长回文子序列可以将序列倒过来求一遍LCS,而这里要求字典序最小,可以开一个结构体同时更新字典序,不过求出来的并不一定是回文子序列。 比如: bcbacbc cbcabcb 求出来LCS字典序最小显然是bcabc,并不是回文的。 则这里考虑一半最优解求出另一半,则必然是回文的,注意考虑奇偶。 思路2:看别人代码,还有种思路,用d[i原创 2015-01-27 11:55:18 · 369 阅读 · 0 评论 -
uva 10635 Prince and Princess LIS
题意:有两个长度为p+1,和q+1的序列,第一个都为1,且元素都不相同,求最长公共子序列。 想法:总序列长度可以达到250^2,不能用O(pq)的方法求LCS,而发现所有元素都不相同,则可以将A重新编号为1,2,3,4 ……,然后将B映射,求LIS即可,A中不存在的在B中映射为0,可以直接求LIS,因为元素均不相同,而且第一个肯定是最小的为1,即便0后面更新,也只能更新长度为1的最小值。 #i原创 2015-01-20 11:11:50 · 321 阅读 · 0 评论