
经典DP问题
文章平均质量分 53
deng_yu
这个作者很懒,什么都没留下…
展开
-
poj 1191 棋盘分割 DP
dp[k][x1][y1][x2][y2]表示(x1,y1)和(x2,y2)所围成的区域切割k次所得的方块各个平方的和切割可以横向或纵向,切割一次之后可以在所得的两块中选择一块继续切割,另一块保持不动s[x1][y1][x2][y2]表示(x1,y1)和(x2,y2)围成原创 2011-08-25 16:35:15 · 306 阅读 · 0 评论 -
poj 1390 Blocks 方块消除
把方块按颜色分段,color[i]表示这段方块的颜色,len[i]表示这段方块的长度dp[i][j][k]表示从i段到j段,第j段之后有k个方块与第j段颜色相同对第j段,有两种处理方法直接消除或者与前面的某一段一起消除dp[i][j][k] = max(dp[i]原创 2011-08-25 11:24:40 · 437 阅读 · 0 评论 -
poj 1836 最大上升子序列 (LIS)
分别按顺序和逆序做两遍LIS,然后枚举中点#includeusing namespace std;int main(){ int n,l[1003],r[1003]; double num[1003]; int i,j,max; scanf("%d",&n);原创 2011-08-26 15:13:05 · 285 阅读 · 0 评论 -
poj 1050 To the Max 最大子矩阵和
把二维矩阵转化为一维,然后求最大连续子序列和#includeusing namespace std;int MaxSum(int n,int a[]){ int sum = 0,i,max = INT_MIN; for(i = 1;i <= n;i++) {原创 2011-08-26 15:10:21 · 334 阅读 · 0 评论 -
poj 1903 LIS的Nlogn解法
用一个栈储存上升子序列,对每一个输入的数a,与num[top]相比,若a > num[top]入栈,否则在栈中找到第一个比a大的数,用a替换查找时由于是有序,用二分查找#includeusing namespace std;int binarySearch(int l原创 2011-08-26 15:18:14 · 493 阅读 · 0 评论 -
poj 2479 两段连续子序列的最大和
对每一个点,求它的左边的最大连续子序列和以及右边的最大连续子序列和,取最大值由于两段区间不连续,对点i,所以max = left[i] + right[i+1];#includeusing namespace std;int main(){ int t,l[500原创 2011-08-26 16:27:21 · 624 阅读 · 0 评论 -
poj 2192 Zipper DP
dp[i][j]表示s1[]的前i个字符与s2[]的前j个字符能否成功组合,值分别为0,1如果dp[i-1][j] == 1并且s1[i-1] == s3[i-1+j](s1,s2,s3都是从0开始的,所以取其中某个字符时要减1),则dp[i][j] = 1 ; 如果dp原创 2011-08-27 18:28:14 · 289 阅读 · 0 评论