陣列中最長遞增子串行的長度

2021-07-22 09:42:26 字數 780 閱讀 7161

求陣列中最長遞增子串行的長度

什麼是最長遞增子串行呢?

問題描述如下:

設l=是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin=,其中k1

如:在序列1,-1,2,-3,4,-5,6,-7中,其最長的遞增子串行為1,2,4,6。其長度為4。

對於這個問題有以下幾種解決思路:

1、把a1,a2,...,an排序,假設得到a'1,a'2,...,a'n,然後求a的a'的最長公共子串,這樣總的時間複雜度為o(nlg(n))+o(n^2)=o(n^2);

2、動態規劃的思路:

另設一輔助陣列b,定義b[n]表示以a[n]結尾的最長遞增子串行的長度,則狀態轉移方程如下:b[k]=max(max(b[j]|a[j]

這個狀態轉移方程解釋如下:在a[k]前面找到滿足a[j]

實現**如下:

#include using

namespace

std;

intmain()

for(max=i=0;i//

求出整個數列的最長遞增子串行的長度

if(b[i]>max)

max=b[i];

cout

}return0;

}

顯然,這種方法的時間複雜度仍為o(n^2);

3、對第二種思路的改進:

第二種思路在狀態轉移時的複雜度為o(n),即在找a[k]前面滿足a[j]

設想如果能把順序查詢改為折半查詢,則狀態轉移時的複雜度為o(lg(n)),這個問題的總的複雜度就可以降到nlg(n).

陣列中最長遞增子串行

陣列是亂序的,如1,1,2,3,4,5,6,7 根據無後效性定義,陣列中當前元素所形成的子串行與其前面元素形成的子串行沒有關係,所以 lis i 1 max 1,lis k 1 其中,array i 1 arry k 且任意k i lis i 儲存對於當前陣列arry i 形成的最長子序列的長度值,...

求序列中最長遞增子串行的長度

include define maxnum 100 函式功能 求解序列中的最大遞增子串行的中包含的元素個數 演算法說明 用到了動態規劃問題,分解子問題b陣列是用來儲存每乙個子串行中的最大遞增子串行 求具有n個元素的序列中的最大遞增自序列問題分解為 a 0 a 0 a 1 a 0 a 1 a 2 a ...

求陣列中最長遞增子串行

原文見 分析過程很清楚。這裡主要是 部分有改動。完全用c寫的,從檔案中讀入。另外,解法二的程式加了去重,求的是最長單調遞增子串行。求陣列中最長遞增子串行 寫乙個時間複雜度盡可能低的程式,求乙個一維陣列 n個元素 中的最長遞增子串行的長度。例如 在序列1,1,2,3,4,5,6,7中,其最長的遞增子串...