线性DP就是在DP的基础上可以画一颗树,更好理解。
一道例题:http://172.45.253.16:8080/problem/8
第一种方法:最朴素的暴力算法,先算出所有的子序列,看符合条件的数列,再统计其中的最大值,显然,这种方法很容易超时。
第二种方法:直接暴搜
第三种方法:线性DP,先设所有为1,数列里面的每一个数都向前看,发现比自己小的就转换,这样就很容易得出转移方程f[i]=Max{f[j]+1}(i>j,a[j]>a[i]),(j=1——i-1)
附上代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=100+6;
int f[maxn],a[maxn];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
f[i]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
if(a[j]>a[i])
f[i]=max(f[i],f[j]+1);
int ans=-1;
for(int i=1;i<=n;i++)
ans=max(f[i],ans);
cout<<ans;
return 0;
}