本题的思路:
用数组a[]来存输入的数据,用数组b[i]来存到a[i]最长子序列的长度。
通过状态转移方程max=max{b[x1],b[x2]........b[xi]};并且有(0<=xi<i;a[xi]<a[i]),则可以得到a[i]之前的数所组成的最长子序列了,
切b[i]=max+1;
AC代码如下:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<cstdlib> #include<queue> #define MAXN 1005 #define LL long long int using namespace std; int a[MAXN]; int b[MAXN]; int main(){ int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ cin>>a[i]; b[i]=1;//每个数据自身可构成一个长度为一的串 } int max; for(int i=1;i<n;i++){//循环控制用来寻找以位置i结束的最长子串 max=0;//用来记录寻早到的位置i以前的最长子串的长度 for(int j=0;j<i;j++){//表示以位置j结束时并且满足转移方程是的子串长度 if(a[j]<a[i]&&b[j]>max){//筛选出最长子串 max=b[j]; } } b[i]=max+1;//加上自身的长度就为以位置i结束的最长子串 } max=0; for(int i=0;i<n;i++){ if(max<b[i]) max=b[i]; } cout<<max<<endl; } return 0; }