思路:求最长不下降子序列即可,从后往前一一枚举。设dp[n]=1,从n-1往1枚举,每次取该点之后比它高且dp值最大的一个,则dp[i]=max+1。最后,找出dp[1->n]最大的即为所求。
//求最长不下降序列的长度
#include<stdio.h>
int main()
{
int n,i,j,k,ans,max;
int height[100000],dp[100000];
while(scanf("%d",&n)!=EOF)
{
ans=-1;
for(i=1;i<=n;i++)
{
scanf("%d",&height[i]);
dp[i]=1;
}
for(i=n-1;i>=1;i--)
{
max=-1;
int mark=0;
for(j=i+1;j<=n;j++)//每次找出第i个点之后dp[]值最大的点且比它要高
if(dp[j]>max&&height[j]>=height[i])
{
max=dp[j];
mark=1;
}
if(mark)
dp[i]=max+1;
if(ans<dp[i])
ans=dp[i];
}
//for(i=1;i<=n;i++)
// printf("%d ",dp[i]);
printf("%d\n",ans);
}
return 0;
}