#include <cstdio>
#include <algorithm>
using namespace std;
const int N=100;
int A[N],dp[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&A[i]);
}
int ans=-1;//记录最大的dp[i]
for(int i=1;i<=n;++i)
{
dp[i]=1; //边界初始条件,(即先假设每个元素自成一个子序列)
for(int j=1;j<i;++j)
{
//如果存在在A[i]之前的元素A[j](j<i),使A[j]<=A[i]且dp[j]+1>dp[i]
//即把A[i]跟在以A[i]结尾的lis后面时能比当前以A[i]结尾的lis长度更长
//则把A[i]加入以A[i]结尾的lis后面,形成一条更长的不下降子序列
if(A[i]>=A[j]&&(dp[j]+1>dp[i]))
dp[i]=dp[j]+1; //状态转移方程,用以更新dp[i]
}
ans=max(dp[i],ans); //更新ans
}
printf("%d",ans);
return 0;
}
测试用例:
输入:
8
1 2 3 -9 3 9 0 11
输出:
6