
DP
deng_yu
这个作者很懒,什么都没留下…
展开
-
poj 1163 The Triangle 基础DP
题意:一个数字三角形,第i行有i个数,从每个数可以移动到左下方或又下方,求从顶层到底层的所有路径中,最大的数字和思路:状态:d[i,j]表示点(i,j)到底层的数字和,转移方程:d[i,j] = max(d[i+1,j],d[i+1,j+1]) + num[i][j](num原创 2011-08-14 12:50:07 · 230 阅读 · 0 评论 -
动态规划原理
子问题与原问题具有完全相同的结构是否可以用结束状态确定 状态? 不一定具有无后效性?在每个子问题的求解中都利用了它前面的子问题的最优化结果,依次进行,最后一个子问题所得到的最优解就是整个问题的最优解最优化原理:局部最优解导致全局最优解无后效性 (D原创 2011-08-23 15:10:57 · 616 阅读 · 0 评论 -
poj 1953 World Cup Noise DP
对于每一个数,它是前一个数在末尾加1或0得到的;状态为dp[][2],dp[i][0]表示长度为i,结尾为0的数的个数,dp[i][1]表示长度为i,结尾为1的数的个数;dp[i][0] = dp[i-1][0] + dp[i-1][1];dp[i][1] = dp[原创 2011-08-27 15:03:57 · 295 阅读 · 0 评论 -
poj 1157 LITTLE SHOP OF FLOWERS DP 背包问题变形
dp[i][j] 表示前i个花瓶装j朵花,类似于体积刚好为V的01背包问题在本题中花瓶可以选择使用或者不使用,类似于背包问题中的物品,背包问题中的体积即为本题的花瓶数总体积为v,有f个物品,每一个体积为1,价值为value[f][v]由于是刚好装满背包,所以初始化dp原创 2011-08-27 11:25:34 · 305 阅读 · 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 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 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 评论 -
hdu 1231 最大连续子序列和
和hdu 1003一样#includeusing namespace std;int main(){ int n; int num[10003]; while(scanf("%d",&n) != EOF&&n) { int i,j,sum = 0,begin,e原创 2011-08-24 08:38:24 · 306 阅读 · 0 评论 -
hdu 2191 多重背包
#includeusing namespace std;int N,V,dp[105];int max(int a,int b){ return a > b ? a : b;}void ZeroOnePack(int weight,int value){ for原创 2011-08-21 15:26:40 · 227 阅读 · 0 评论 -
poj 1014 Dividing 多重背包
题意:价值为1~6的弹珠各有若干个,问能否按价值均分思路:多重背包,V为总价值的一半,若dp[V] == V,则能均分#includeusing namespace std;#define max(a,b) ((a)>(b)?(a):(b))void ZeroOne原创 2011-08-21 16:27:52 · 257 阅读 · 0 评论 -
poj 2181 Jumping Cows DP
题意:一群牛的初始跳跃高度为0,一些药能提高它们的跳跃能力,奇数次服用药是提高跳跃能力,偶数次降低,求最高高度思路:见注释#includeusing namespace std;const int MAX = 150005;int dp[MAX][2],nu原创 2011-08-17 14:29:55 · 302 阅读 · 0 评论 -
hdu 1003 DP
最大子序列之和状态转移方程:sum[i] = sum[i-1]>0?sum[i-1]+num[i]:num[i]比较max 和sum[i],判断是否更新sta ,end#includeusing namespace std;int main(){ int t,原创 2011-08-17 11:37:17 · 210 阅读 · 0 评论 -
poj 3624 Charm Bracelet DP 01背包
写成二维数组,空间太大,RE#includeusing namespace std;int max(int a,int b){ return a>b?a:b;}int main(){ int n,m,i,j,w[3500],d[3500],dp[13000];原创 2011-08-17 17:47:32 · 200 阅读 · 0 评论 -
poj 1141 Brackets Sequence DP
DP基础题#includeusing namespace std;char str[110];int dp[110][110],path[110][110];void output(int i,int j){ if(i > j) return ; if(i ==原创 2011-08-16 15:13:35 · 191 阅读 · 0 评论 -
hdu 2602 DP 01背包
就是最简单的01背包问题一维空间#includeusing namespace std;int main(){ int t; scanf("%d",&t); while(t--) { int N,V,w[1005],v[1005],dp[1005];原创 2011-08-17 18:07:22 · 208 阅读 · 0 评论 -
poj 1651 Multiplication Puzzle DP
题意:一串数字,除了第一个和最后一个,每次从中取出一个数并计算它和前后两个数的乘积,把这些乘积累加,求最小值分析:每一次的乘积只和取出的数,第一和最后一个数这三个因素有关,设最后取出的数在位置j,那么从第一个数到j和从j到最后一个数是两个互不影响的区间,乘积和最小值为左右原创 2011-08-15 19:59:28 · 214 阅读 · 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 评论