DP的常用模型大总结
DP的常用模型大总结(1)
数字三角形模型
- 这个模型可能是基本所有人初学dp的时候,都会接触到的。就是给你一个三角形的数阵,让你从底往上走,找到所有路径中权值和最大/最小的那条路径。这是最基础的情况,做法不赘述。
- 扩展1:三角形变成矩形,从左上角到右下角,只能向下走或者向右走。
- 扩展2:同样是矩形,不过是走两次,找出最大的权值和,一个点的权值在取一次后变成0,权值可以是负数,注意这个扩展跑两次扩展1的做法是不对的,局部最优+局部最优不一定是全局最优。
- 扩展3:同样是矩形,变成取k次,同样是找出最大的权值和,这个问题k小的情况下同样可以使用dp解决,但其本质上是图论中的费用流问题。
最长上升子序列模型
- 找到一个序列\(a\)的最长上升子序列,朴素方法是\(O(n^2)\)的,具体方法是假设\(f[i]\)的含义是以第i个数为结尾的的最长子序列的长度,确定\(f[i]\)的方法就是遍历前面i-1个数,假设遍历下标为k,找出所有满足\(a[k] < a[i]\)中\(f[k]\)最大的做转移即可。
- 扩展1:求先递增再递减或者先递减再递增的最长序列长度。
- 扩展2:最大上升子序列和的问题,就是问你上升子序列的权值和最大是多少。
- 扩展3:需要几个上升子序列才可以不重不漏的把原序列全部覆盖。
- 扩展4:需要几个上升或者下降子序列才可以把原序列不重不漏的覆盖掉。
- 优化1:使用一个数组\(a[i]\)表示最长上升子序列长度为i的的最低高度,注意倒序更新去掉后效性,最后数组大小即是最长上升子序列的长度,如果要输出方案,记录每个位置的更新下标,使得更新下标有序就是合法方案。如果问合法方案的种数,可以转化为图的路径条数问题去解决。
- 优化2:时间复杂度\(O(nlogn)\),建个有序表,保证h单调的同时w也单调。也就是优化方法1加上了二分。
最长公共子序列模型
-
时间复杂度\(O(n^2)\),具体方法略(不赘述了,网上关于这个的其它博客太多了)
-
扩展1:最长上升公共子序列,如果第一次做就能想出来,说明你对dp很有天赋,恭喜,方法如下,
\[我们定义f[i][j] 为A序列在使用第i个的情况下,末端为B[j]的最长上升子序列的长度。那么转移方式的就是f[i][j] = max{f[i-1][k],b[k] < b[j]},时间复杂度是O(n^2) \]
背包问题有崔添翼老师的背包九讲珠玉在前,想对这个模型有更加深入了解的可以读一下那篇经典的文章。
浙公网安备 33010602011771号