C++ 求最長遞增子序列(動態規劃)
阿新 • • 發佈:2019-02-28
i++ 序列 有序 ostream 一個數 ace std for 個數
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; } return0; }
C++ 求最長遞增子序列(動態規劃)