线性动态规划,是较常见的一类动态规划问题,其是在线性结构上进行状态转移
不像背包问题、区间DP等有固定的模板(但是模版也相对固定,更多的是要通过题目来思考)
线性动态规划的目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式
目的是求目标函数的最大值或最小值
(直观理解来看,只要状态转移方程能写成分段函数的,在某种意义上都能说他是线性DP,但本质仍是需要去探究信息流动的过程)
因此,除了少量问题(如:LIS、LCS、LCIS等)有固定的模板外,大部分都要根据实际问题来推导得出答案
常见问题
1.序列问题(最长不下降序列、拦截导弹、友好城市、合唱队形、最长公共子序列、回文字符串、最长公共子上升序列)
3.最大和问题(最大连续字段和、最大子矩阵问题加强版、方格取数、数字三角形)
4.其他(不一定是线性DP)(数的划分、奇怪电梯、Crossing River、机器分配、尼克的任务、Increasing Frequency)
序列问题
序列问题一般是研究某个序列S的子序列T的问题
所谓子序列,就是从一串元素序列S中,不改变顺序地,抽取任意个元素
构成了新序列T,T就是S的子序列
LIS 最长不下降子序列
LIS问题(Longest Increasing Subsequence),最长上升子序列
其一般为求最长下降子序列或是最长上升子序列
用DP[i]表示A[i]为结尾的最长上升子序列的长度,则有状态转移方程:
寻找边界条件:
模板如下:
合唱队形
题目简述
N位同学排成一排,要求同学们从左到右先递增再递减(不可以相等)问至少需要几位同学出列,剩下的同学才能满足要求?
约束条件
N≤100
从左往右求一个最长上升dp1[ ],从右往左求一个最长上升dp2[ ],然后枚举每个点i,求n-(max(dp1[i]+dp2[i])-1)
LCS 最长公共子序列
LCS问题(Longest Common Subsequence),求序列的最长公共子序列
寻找边界条件:
模板如下:
*最长公共上升子序列