首先是01背包问题,可以把它看做是一个 表格行和列分别是体积从1,2,,,,v,每个物品的花费c1,c2,,,cn,每个空格里的数代表放入第i个物品在体积为j的背包里的最大价值。dp[j]表示体积为j的背包,放入物品后,可以得到的最大值。状态转移方程为if(j>=c[i]) dp[j]=max(dp[j],dp[j-c[i]]+w[i])。
关键代码:
for(int i = 0;i < n;i++) for(int j = v;j >= c[i];j--) dp[j]=max(dp[j-c[i]]+w[i],dp[j]);
其次是连续子序列的最大和,dp[i]表示以a[i]为结尾的连续子序列的最大和,则状态转移方程为dp[i]=max(dp[i-1],a[i]),关键代码:
for(int i = 1;i < n;i++) dp[i]=max(dp[i-1]+a[i],a[i]);
最后是最大严格递增子序列的和,个人感觉有点像01背包,可以看做是一个二维表格,每次都更新到最大值。dp[i]表示以a[i]为结尾的最大严格递增子序列的和。只要在i之前的,且比a[i]小的都满足条件。关键代码:
for(int i = 0;i < n;i++){ dp[i]=a[i]; for(int j = 0;j < i;j++){ if(a[i]>a[j]) dp[i]=max(dp[j]+a[i],dp[i]); } }