摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555我的DP方程:f[i][j]表示数的第i位以j开头的数含有49的个数,则状态转移方程为: 1.j!=4时: f[i][j]=sum{ f[i-1][k] | 0<=k<=9 } 2.j==4时:f[i][j]=sum{ f[i-1][k] | 0<=k<=9 } - f[i-1][9] + pow(10,i-2) (因为j=4时,只要i-1位为9,后面的都满足)这样的转移方程思路比较清晰,在网上看到别人的转移方程是这样的: 1.f[i][0]=10*f[i-1][0]- 阅读全文
posted @ 2013-03-21 14:35 zhsl 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3345 国家之间可能存在依赖关系,可以求出每个国家向下的每种情况的最优消费,即f[u][i]表示节点为u时选择i个国家的最优消费。自底向上更新时就是分组背包问题了: f[u][i]=Min{ f[u][i],f[u][i-j]+f[v][j] | v为u的儿子节点,0<=j<=v子树的节点数 },其实本来是3维的,不过这里用滚动数组优化了。 1 //STATUS:C++_AC_16MS_588KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #inclu 阅读全文
posted @ 2013-03-21 14:20 zhsl 阅读(514) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3280 典型的区间DP问题,fp[i][j]表示第i-j个字符经过修改后的最优值,则状态转移方程如下: f[i][j]=Min(f[i][j],f[i][j-1]+Min(cost[s[j]][0],cost[s[j]][1])); f[i][j]=Min(f[i][j],f[i+1][j]+Min(cost[s[i]][0],cost[s[i]][1])); if(s[i]==s[j]) f[i][j]=Min(f[i][j],f[i... 阅读全文
posted @ 2013-03-21 14:04 zhsl 阅读(186) 评论(0) 推荐(0) 编辑