顾名思义,线性DP就是在一条线上进行DP,这里举一些典型的例子。
LIS问题(最长上升子序列问题)
题目
给定一个长度为N的序列A,求最长的数值单调递增的子序列的长度。
上升子序列B可表示为B={Ak1,Ak2,···,Akp},其中k1<k2<···<kp。
解析
状态:F[i]表示以A[i]为结尾的最长上升子序列的长度,边界为f[0]=0。
状态转移方程:F[i]=max{F[j]+1}(0≤j<i,A[j]<A[i])。
答案显然为max{F[i]}(1≤i≤N)。
事实上,无论是上升、下降还是不上升等等此类问题,代码都是相似的,唯一的区别只是判断的符号更改罢了。
Code
#include <iostream> using namespace std; int n,a[100],f[100],maxn; int main() { f[0]=0; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; for(int j=1;j<n;j++) if(a[j]<a[i]) f[i]=max(f[i],f[j]+1); maxn=max(maxn,f[i]); } cout<<maxn; return 0; }