最長遞增子串行是動態規劃中最經典的問題之一,我們從討論這個問題開始,循序漸進的了解動態規劃的相關知識要點。
在乙個已知的序列 中,取出若干數組成新的序列 , 其中下標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...