题目:
分析:
题目的要求其实就是在保证上升的情况下串尽可能长,输出长度
那么就可以用数组b[i][1]表示数值,b[i][2]表示从下标为i到序列末的最长长度
从末尾开始循环,i=n,n-1....1;j=i+1,i+2...n;也就是寻找一个b[j][1]>b[i][1]并且b[j][2]是从i往后最大的
最后,找到最大的b[i][2]输出
代码如下:
#include<cstdio> int b[1003][3],i,j,l,k,n;//b[i][1]:数值 b[i][2]:从i到n的最长序列长度 int main() { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&b[i][1]); b[i][2]=1;b[i][3]=0; } for(i=n-1;i>=1;i--) { l=k=0; for(j=i+1;j<=n;j++) if(b[j][1]>b[i][1]&&b[j][2]>l) l=b[j][2]; if(l>0) b[i][2]=l+1; } k=1; for(j=1;j<=n;j++) if(b[j][2]>b[k][2]) k=j; printf("%d",b[k][2]); }