数字三角形模型
1.摘花生
这题比较容易,二维dp
2.最低通行费
本质与摘花生相同
3.方格取数
四维dp,可优化为三维,相同点只加一次w[i][j]
4.传纸条
四维dp,可优化为三维,代码可以与上一题一样,证明过程有收藏
最长上升子序列模型
5.怪盗基德的滑翔翼
最长上升子序列dp
6.登山
本质是最长上升子序列,两侧都要dp一次
7.合唱队形
本质是最长上升子序列,两侧都要dp一次
8.友好城市
本质是最长上升子序列,只dp递增的一侧
9.最大上升子序和
本质上是最大上升子序列,因为原始的最大上升子序列dp O(n*n)能枚举出所有的最大上升子序列,修改属性(len)为最大值(max)即可
10.拦截导弹
本质是最长上升子序列,统计方案数需要贪心思想,每次往比当前高度大的最小的系统中添加
11.导弹防御
本质最长上升子序列第二版(找位置放),但是递增递减不定,只有采用搜索策略
12.最长公共上升子序列
注意状态表示和状态转移方程,和前面的不一样。
背包模型
- 不优化维度的枚举必须从0-V枚举,不能从v[i]-V枚举,会出现错误,详情见AcWing 423 采药.打卡代码
- 求是否能够凑出价值为j的货币的时候是可以直接用dp[i][j]是否==0来判断的,详情解析见货币系统
- 多重背包3中采用单调队列进行优化,以达到O(NV)的时间复杂度,这里有一点关键理解在于每次循环考虑的是当前状态转移方程中的状态,如f[i][j]=max(f[i-1][j],f[i-1][j-v],f[i-1][j-2v]…)中的状态,不要想到其他的f[i][k]中去了。其次代码过程稍有复杂,需要深入理解过程才能写正确.