最長不降子串行(C 實現)

2021-09-01 12:28:05 字數 956 閱讀 1294

給定有 n 個整數組成的數列an=。an的乙個長度為m的不降子串行 bm,即bm 包含於an且滿足對任意1≤i<j≤m有bi≤bj。例如 an = ,則 就是乙個長度為 4 的不下降序列,同時也有長度為 6 的不下降序列。請設計演算法,求所有 an的不降子串行中,最長的長度。

要求:①輸入格式:第一行輸入整數 n (n<20);第二行輸入n 個整數 a_i

②輸出格式:第三行一行資料表示所求結果

演算法分析:根據動態規劃的原理,由後往前進行搜尋。

1·對a(n)來說,由於它是最後乙個數,所以當從a(n)開始查詢時,只存在長度為1的不下降序列;

2·若從a(n-1)開始查詢,則存在下面的兩種可能性:

①若a(n-1)a(n)則存在長度為1的不下降序列a(n-1)或a(n)。

3·一般若從a(i)開始,此時最長不下降序列應該按下列方法求出:

在a(i+1),a(i+2),…,a(n)中,找出乙個比a(i)大的且最長的不下降序列,作為它的後繼。倒推公式為f(i)=max+1

f[i]:表示以第i個位置為起點的最長不下降序列的長度。

k的選擇範圍:a(i+k)>a(i) i+k≦n

最後從f[1]到f[n]中選取最大的即為最優解

當然也可以採用順推的方法,順推公式:f(i)=max+1

f[i]:表示以第i個位置為終點的最長不下降序列的長度。

k的選擇範圍:a(i-k)using namespace std;

const int n = 1000;

int a[n], c[n], f[n]; // f[i]用於記錄a[0最長不降子串行i]的最大長度

int bsearch(const int *c, int size, const int &a)

}int lis(const int *a, const int &n)

return size;

}int main()

最長不降子串行

原文 這題目是經典的dp題目,也可叫作lis longest increasing subsequence 最長上公升子串行或者 最長不下降子串行。很基礎的題目,有兩種演算法,複雜度分別為o n logn 和o n 2 一 問題描述 設有由n個不相同的整數組成的數列,記為 a 1 a 2 a n 且...

最長不降子串行問題

一 問題 輸入 設有由n個不相同的整數組成的數列,記為 a 1 a 2 a n 且a i a j i j 若存在i1長度為e的不下降序列。輸出 程式要求,當原數列給出之後,求出最長的不下降序列。例子 數列3,18,7,14,10,12,23,41,16,24。3,18,23,24就是乙個長度為4的不...

最長不降子串行 dp

問題描述 給定乙個字串,求出其不降子串行的最大長度。分析 從後往前逆推 06對於n個數,我們可以分為n 1個階段。07我們由後向前搜尋 逆推法 我們可以這樣思考 081 對a n 來說,由於它是最後乙個數,所以當從a n 開始查詢時,只存在長度為1的不下降序列 092 若從a n 1 開始查詢,則存...