1. 程式人生 > >C++ 求最長遞增子序列(動態規劃)

C++ 求最長遞增子序列(動態規劃)

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; } return
0; }

C++ 求最長遞增子序列(動態規劃)