线性DP的几种模型和例题
我们知道,动态规划用来解决一类最优化问题,通过将原问题分解成若干的子问题,并综合子问题的最优解从而得到原问题的最优解,线性DP就是这么一种现行的分析DP的思路。
我们这里来介绍几种常见的模型以及例题:
1.数字三角形模型
例题:898. 数字三角形 - AcWing题库

状态表示:
f[i]j[j] 表示从顶点走到[i][j]这个点的最大距离;
状态计算:考虑能走到[i][j]这个点的两种方法,一种是从左上方来,一种是从右上方来,而这两者的最长距离已经计算,所以可以得到状态转移方程:
f[i][j] = max(f[i-1][j] + q[i][j] , f[i-1][j-1] + q[i][j] )
2.最长上升子序列
例题:895. 最长上升子序列 - AcWing题库

这道题由于数据范围只有1000,所以我们可以用O(n^2)的时间复杂度来解决
状态表示:f[i]表示的是以q[i]为结尾的最长上升子序列(所以我一共得扫两次数列q)
状态计算:循环就好了,但是最大值不一定是f[i],需要再扫一遍找到最大值
变形:将数据范围提升至

状态表示:f[i][j]代表的是A的前i个字符和B的前j个字符公共子序列的最长长度。
状态计算:可得到如下状态转移方程:
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
if(a[i] == b[j]) dp[i][j] = max(dp[i-1][j-1] + 1, dp[i][j]);
4.最短编辑距离
例题:902. 最短编辑距离 - AcWing题库

状态表示:f[i][j]表示字符串A的前i个字符和B的前j个字符编辑次数的最小值
状态计算:我们考虑会影响编辑次数的三个操作,增、删、改;
把当前的a[i]要进行的三种操作造成的后果进行枚举:
增:f[i][j] = f[i][j-1] + 1; 删:f[i][j] = f[i-1][j] + 1 ; 改: (a[i] == b[j] ) f[i][j] = f[i-1][j-1] (a[i] != b[j] ) f[i][j] = f[i-1][j-1] + 1;
状态转移方程如下:
dp[i][j] = min(dp[i-1][j] + 1,dp[i][j-1] + 1);
if(a[i] == b[j]) dp[i][j] = min(dp[i-1][j-1] ,dp[i][j]);
else dp[i][j] = min(dp[i][j] , dp[i-1][j-1] + 1);