使用動態規劃求解最長遞增子串行(LIS)

2021-07-11 03:15:41 字數 1031 閱讀 6302

給定乙個數列,數列中的數是未排序、可重複的,求其最長遞增子串行(lis)的長度。

如數列

1 7 3 5 9 4 8
其lis為

1 3 5 9

1 3 5 8

則輸出其長度4。

先將數列存入陣列array中

然後把array[n]的lis長度存入陣列result[n]中,

如在數列1、7、3、5、9、4、8中,array[0]為1,lis長度為1,則result[0]為1。

array[1]為7,lis長度為2,則result[1]為2。

array[2]為3,lis長度為2(7因為大於3,被無視了),則result[2]為2。

依次類推

result[n]的值為array[0]~array[n-1]中小於或等於array[n]的數對應的最大的result的值+1。

因為後一項的值總是依賴前面所有的result,故使用動態規劃的方法,從result[0]開始求,直到把result陣列填滿,隨後找出result陣列中的最大值即可。

**:(c++)

#include

usingnamespacestd;

#define n 5000

int array[n];

int result[n];

int main()

result[0] = 1;

for (int i = 1; i < n; i++)

result[i] = max + 1;

}int max = 0;

int min = 0;//min為lis的最後一項的值。若多個lis的程度相等,取最後一項最小的

for (int i = 0; i < n; i++)

if (result[i] == max)

min = min < array[i] ? min : array[i];

}cout << max << " "

<< min << endl;

}return0; }

動態規劃求解最長遞增子串行的長度

一,問題描述 給定乙個序列,求解它的最長 遞增 子串行 的長度。比如 arr 的最長遞增子串行長度為4。即為 1,4,5,9 二,演算法分析 有兩種方式來求解,一種是轉化為lcs問題。即,首先對陣列排序,將排序後的結果儲存在輔助陣列中。排序時間複雜度o nlogn 排序後的陣列與原陣列組成了lcs ...

動態規劃求解最長遞增子串行的長度

一,問題描述 給定乙個序列,求解它的最長 遞增 子串行 的長度。比如 arr 的最長遞增子串行長度為4。即為 1,4,5,9 二,演算法分析 有兩種方式來求解,一種是轉化為lcs問題。即,首先對陣列排序,將排序後的結果儲存在輔助陣列中。排序時間複雜度o nlogn 排序後的陣列與原陣列組成了lcs ...

動態規劃 最長遞增子串行

給出序列 1 2 3 4 2 5 3 4 a 1 1,a 2 2,a 7 3,a 8 4 求其最長的遞增子串行,以上最長遞增子串行為 1 2 3 4 5 問題細分 初始化條件f 1 1,序列只有1個長度即為1 f 2 a 2 與下標小於2的比較,即a 1 比較,a 2 a 1 因此更新f 2 f 1...