线性DP总结
总结
DP在这些问题都体现在“作用在线性空间上的递推”
即“从一个或多个 【边界点】开始有方向地向整个状态空间转移、扩展,最后每个状态上都保留了以自身为【目标】的子问题的【最优解】”。
我们看到,设计状态转移方程,不一定要以”如何计算出一个状态“给出,也可以考虑”一个已知状态应该更新哪些后续阶段的未知状态“。
LIS(最长上升子序列)
问题概述
给定一个长度为N的数列A,求数值单调递增的子序列的长度最长为多少。A的任意子序列B可表示为:
状态表示
F[i]表示以A[i]为结尾的“最长上升子序列”的长度。
阶段划分
子序列的结尾位置(数列A中的位置,从前到后)
转移方程
边界
F[0] = 0
目标
LCS(最长公共子序列)
问题概述
最长公共子序列。给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。
状态表示
F[i,j]表示前缀子串 A[1 ~ i] 与 B[1 ~ j] 的“最长公共子序列”的长度。
阶段划分
已经处理的前缀子串(两个字符串中的位置,即一个二维坐标)
转移方程
边界
F[i,0] = F[0,j] = 0
目标
F[N,M]
数字三角形(在三角矩阵上移动)
问题概述
给定一个共有N行的三角矩阵A,其中第i行有i列。从左上角出发,每次可以向下方或右下方走一步,最终到达底部。求把经过的所有位置上的数加起来,和最大是多少。
状态表示
F[i,j]表示从左上角走到第i行第i列,和最大是多少。
阶段划分
路径的结尾位置(矩阵中的行,列位置,即一个二维坐标)
转移方程
边界
F[1,1] = A[1,1]