給定乙個數列,數列中的數是未排序、可重複的,求其最長遞增子串行(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...