思路
dp 我们用f[i]来表示 a[i]可以构成的最长上升子序列
首先 一个数字就是长度为1的序列
所以我们需要将所有的f[i]初始化为1
然后我们考虑状态
比如 f[j]
当指针来到a[j]这个数
前面所有数已经算完固定
则a[j]所能形成的最长上升子序列的条件是
1.a[j]大于前面的数
2.f[i]是小于a[j]里面的数之中子序列最长的
如果满足条件
则f[j]=f[i]+1;加上a[j]这个元素长度加1
模拟例子
当指针来到a【1】
前面没有比他小的数 f[1]=1;
来到a[2]
3>1
f【2】=1;
来到a[3]
1<2;
所以f[2]可以继承1 形成的最长子序列
f[3]=2;
···
来到最后一个数
其前面小于他且子序列最长的数是5
因此 直接继承5的子序列且长度+1;
因此最终答案为4;
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include <algorithm>
using namespace std;
const int N=1010;
int a[N],f[N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
f[i]=1;
}
int res=0;
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(a[i]>a[j]){
f[i]=max(f[i],f[j]+1);
res=max(res,f[i]);
}
}
}
cout<<res;
return 0;
}