状态表示:f [ i ] 以第 i 个数为结尾的最长上升子序列的长度
用 j 将 1 -- i -1 从前往后遍历,每个f [ i ] 初始化成1;是递增则触发判断
状态计算 : f [ i ] = max ( f [ i ] , f [ j- 1 ] + 1 )
#include <bits/stdc++.h>
using namespace std;
int a[5050];
int f[5050];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
//f[i]=max(f[1]+1,f[2]+1,...,f[i-1]+1)
for(int i=1;i<=n;i++)
{
f[i]=1;//初始长度为1
for(int j=1;j<i;j++)
if(a[i]>a[j]) f[i]=max(f[i],f[j]+1);//得是递增才会触发判断
}
int k=1;
for(int i=2;i<=n;i++)if(f[i]>f[k])k=i;
cout<<f[k];
return 0;
}