dp[i][j]=max{dp[i-1][j-v[i]]+c[i],dp[i-1][j]};
for(i=1;i<=n;i++){ for(j=v[i];j<=v;j++){//注意这里是从v[i]开始到V if(j>=v[i]) dp[j]=max{dp[j],dp[j-v[i]]+c[i]}; } }
dp[j]=max{dp[j],dp[j-v[i]]+c[i]};
dp[i][j]=max{dp[i-1][v-k*v[i]]+k*c[i]|0<=k<=n[i]};(k表示第i种物品放入k件);
for(i=1;i<=n;i++){ for(j=v;j>=0;j--){ for(k=1;k<=n[i];k++){ if(j>=k*v[i]) dp[i][j]=max(dp[i-1][v-k*v[i]]+k*c[i]) } }
f(4) = f(3) + f(2) + f(1);
最长公共子序列: 根据最长公共子序列问题的性质,我们可以规定dp[i][j]为字符串1的前i个字符和字符串2的前j个字符的最长公共子序列的长度, 由于下面涉及到i-1和j-1,那么这个时候我们一般从i=1和j=1开始到i<=len1, j<=len2。 1ch1[i-1] = ch2[j-1] ,那么dp[i][j]= dp[i-1][j-1] + 1;
这个时候所有i=0或j=0的dp[i][j]= 0; 0 ; i = 0或j= 0; 就有 dp = dp[i][j] = dp[i-1][j-1] + 1; i > 0且j> 0 且ch1[i-1]= ch2[j-1]; dp[i][j]= max {dp[i-1][j] , dp[i][j-1]}; i > 0且j> 0且ch1[i-1]!= ch2[j-1];
3、最大子序列的和问题 给定一个序列a1,a2..........an; 求子序列的和最大问题dp[i]表示以ai结尾的子序列和,max为最大子序列和 核心: 1如果输入的数据全部为负数则最大值就是序列中的一个最大值 2如果有正数 for(i=1;i<=n;i++){ dp[i]=dp[i-1]+ai; if(dp[i]<0) dp[i]=0; if(max<dp[i]) max=dp[i]; }
2、最长上升或下降子序列 给定一个序列a1,a2..........an; dp[i]表示以ai结尾的最长上升子序列长度(下降相反) 核心代码: for(i=1;i<=n;i++){ dp[i]=1; for(k=1;k<i;k++){ if(ak<ai&&dp[i]<dp[k]+1) dp[i]=dp[k]+1; } }