摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2571简单dp题目,推算最大的路径和:状态:f[i][j]:从第[i,j]到终点的最大值状态转移:f[i][j]=max{f[i+1][j],f[i][j+1],f[i][j*k](k>1)}初始值:f[n][m]=a[n][m];这是递归的思想,而在dp代码中写出来应该是递推的写法:状态转移:f[i][j]=a[i][j]+max{f[i-1][j],f[i][j-1],f[i][j/k](k>1)}这题关键应该在于初始化,为了保证第一行和第一列保留的都是他们原本的数字,可以在二维矩阵外面再多加 阅读全文
posted @ 2013-08-07 21:29 执着追求的IT小小鸟 阅读(250) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2602典型的01背包问题,用动态规划来解即可。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是: f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化 阅读全文
posted @ 2013-08-07 17:17 执着追求的IT小小鸟 阅读(348) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1513给一个字符串,求这个字符串最少增加几个字符能变成回文,如Ab3bd可以增加2个字符变为回文:Adb3bdA。通过这样的结论可以和最长公共子串联系起来(未证明):S和S' (注:S'是S的反串)的最长公共子串其实一定是回文的。这样我们就可以借助lcs来解决该题,即用s的长度减去lcs的值即可。#include #include short ans[2][5001];int max(int a,int b){ return a>b?a:b;} int main(){ int i,j,l 阅读全文
posted @ 2013-08-07 11:35 执着追求的IT小小鸟 阅读(162) 评论(0) 推荐(0) 编辑
摘要: dp过程当中由于递推的方式,经常要的只是最后的一个数据而已,所以前面算出来的数据可放弃,这样可以极大的节省空间,于是有这么一个方法滚动数组举个简单的例子:int d[]=new int[100];d[0]=1;d[1]=1;for(int i=2;i<100;i++)d[i]=d[i-1]+d[i-2];System.out.printf("%d",d[99]);上面这个循环d[i]只需要解集中的前2个解d[i-1]和d[i-2]; 为了节约空间用滚动数组的方法int d[]=new int[3]; d[0]=1;d[1]=1; for(int i=2;i<10 阅读全文
posted @ 2013-08-07 11:28 执着追求的IT小小鸟 阅读(183) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2081要的就是存储中间数据的思想,避免重复计算Source CodeProblem: 2081 User: 297752873/*Memory: 41280K Time: 32MSLanguage: C Result: AcceptedSource Code*/#include#include int a[500001],hash[10000000];int main(){ int i,k; memset(hash,0,sizeof(hash)); a[0]=0;hash[0... 阅读全文
posted @ 2013-08-07 09:46 执着追求的IT小小鸟 阅读(116) 评论(0) 推荐(0) 编辑