最長遞增子串行

2021-07-27 21:37:51 字數 1459 閱讀 4212

最長遞增子串行是動態規劃中最經典的問題之一,我們從討論這個問題開始,循序漸進的了解動態規劃的相關知識要點。

在乙個已知的序列 中,取出若干數組成新的序列 , 其中下標i1

、i2…

im保持遞增,即新數列中的各個數之間依舊保持原數列中的 先後順序,那麼我們稱新的序列為原序列的乙個子串行。

若在子序 列中,當下標ix

>iy

時,ai

x>ai

y ,那麼我們稱這個子串行為原序列的乙個遞增 子串行。最長遞增子串行問題,就是在乙個給定的原序列中,求得其最長遞增子 序列長度。

有序列 ,我們求其最長遞增子串行長度。按照遞推求解的思想, 我們用 f[

i ]代表若遞增子串行以 ai

結束時它的最長長度。當 i 較小,我們容易直 接得出其值,如 f[1] = 1。那麼,如何由已經求得的 f[

i ]值推得後面的值呢?

假設,f[1]到 f[x−

1]的值都已經確定,注意到,以 ax

結尾的遞增子串行,除了長度 為 1 的情況,其它情況中,ax

都是緊跟在乙個由 ai

(i組成遞增子串行之後。要 求以 ax

結尾的最長遞增子串行長度,我們依次比較 ax

與其之前所有的 ai

(i, 若 ai

小於ax

,則說明 ax

可以跟在以 ai

結尾的遞增子串行之後,形成乙個新的遞 增子序列。又因為以 ai

結尾的遞增子串行最長長度已經求得,那麼在這種情況下, 由以 ai

結尾的最長遞增子串行再加上 ax

得到的新的序列,其長度也可以確定, 取所有這些長度的最大值,我們即能得到 f[x]的值。特殊的,當沒有 ai

(i小 於 ax

, 那 麼 以 ax

結 尾 的 遞 增 子 序 列 最 長 長 度 為 1。即

f[x]=max

我們給出求序列的最長遞增子串行長度的所有 f[i]供讀者參考:

【求解最長遞增子串行**如下:】

#include
using

namespace

std;

int max(int a,int b)///取最大值函式

int main()

for(int i=1;i<=n;i++)//按照陣列順序確定每乙個dp[i]

dp[i]=tmax;

}//求出dp的最大值即可

int ans=1;

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

cout

<

}

最長遞增子串行

這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...

最長遞增子串行

最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...

最長遞增子串行

最長遞增子串行 求乙個字串的最長遞增子串行 如 dabdbf最長遞增子串行就是abdf,長度為4 這是一道基本的動態規劃求解的題目,與此類似的還有 最長公共子串行 分析 用一維陣列dp i 來儲存以a i 為末元素的最長遞增子串行的長度,那麼dp i 至少為1 即包含它本身 往前尋找,如果存在a j...