#include<iostream> using namespace std; //method1 /* 利用动态规划来求解。 假设目标数组array[]的前i个元素中,最长递增子序列的长度为LIS[i].那么, LIS[i]=max{1,LIS[k]+1},array[i+1]>array[k],for any k<=i 时间复杂度为O(N^2) */ int findLongest(int* A,int N) { int* LIS=new int[N]; int max=0; for(int i=0;i<N;i++)LIS[i]=1; for(int i=0;i<N;i++) for(int j=0;j<i;j++) { if(A[i]>A[j] && LIS[j]+1>LIS[i]) { LIS[i]=LIS[j]+1; } } for(int i=0;i<N;i++) { if(LIS[i]>max)max=LIS[i]; }
delete [] LIS; return max; } int main() { int N; int* A; while(cin>>N,N) { A=new int[N]; for(int i=0;i<N;i++)cin>>A[i]; int max=findLongest(A,N); cout<<"数组中最长递增子序列长度为:"<<max<<endl; }
delete [] A; system("pause"); return 0; }