i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
a[i] | 1 | 4 | 7 | 2 | 5 | 8 | 3 | 6 | 9 |
lis[i] | 1 | 2 | 3 | 2 | 3 | 4 | 3 | 4 | 5 |
时间复杂度为n^2的算法:
//求最长递增子序列 //2019/2/28 #include<iostream> using namespace std; int LIS(int a[],int N) { int lis[100] = {}; for(int i =0;i<N;i++)//给每一个数的lis赋初值为1 { lis[i]=1; } for(int i = 1;i<N;i++) { for(int j =0;j<i;j++) { if(a[j]<a[i]&&lis[j]<lis[i]+1) //找出当前元素前面比它小的元素,比较其lis值 lis[i] = lis[j] + 1; } } int max = lis[0]; for(int i =1;i<N;i++) { if(lis[i]>max) max = lis[i]; //找出lis数组中最大值,即最长有序子序列的长度 } return max; } int main() { int N; int a[100]; while(cin>>N) { for(int i = 0;i<N;i++) cin>>a[i]; cout<<LIS(a,N)<<endl; } return 0; }