顾名思义,线性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;
}
View Code

相关文章: