最長遞增子串行是動態規劃中經典的問題,詳細如下:
在乙個已知的序列中,取出若干陣列組成新的序列,其中下標i1,i2,...,im保持遞增,即新數列中的各個數之間依舊保持原數列中的先後順序,那麼我們稱新的序列為原序列的乙個子串行。若在子串行中,當下標ix > iy時,aix > aiy,那麼我們稱這個子串行為原序列的乙個遞增子串行。最長遞增子串行問題,就是在乙個給定的原序列中,求得最長遞增子串行長度。
有序列,我們求其最長遞增子串行長度。按照遞推求解的思想,我們用f[i]代表若遞增子串行以ai結束時它的最長長度。當 i 較小,我們容易直接得出其值,如 f[1] = 1。那麼,如何由已經求得的 f[i]值推得後面的值呢?假設,f[1]到f[x-1]的值都已經確定,注意到,以ax 結尾的遞增子串行,除了長度為1的情況,其它情況中,ax都是緊跟在乙個由 ai(i < x)組成遞增子串行之後。要求以ax結尾的最長遞增子串行長度,我們依次比較 ax 與其之前所有的 ai(i < x), 若ai小於 ax,則說明ax可以跟在以ai結尾的遞增子串行之後,形成乙個新的遞 增子序列。又因為以ai結尾的遞增子串行最長長度已經求得,那麼在這種情況下,由以 ai 結尾的最長遞增子串行再加上 ax 得到的新的序列,其長度也可以確定,取所有這些長度的最大值,我們即能得到 f[x]的值。特殊的,當沒有ai(i < x)小 於ax, 那麼以 ax 結尾的遞增子串行最長長度為1。 即f[x] = max的最長遞增子串行長度的所有f[i]為:
f[1] (1)
f[2](4)
f[3](3)
f[4](2)
f[5](6)
f[6](5)12
2233
總結一下,求最長遞增子串行的遞推公式為:
f[1] = 1;
f[i] = max;
intf[maxsize];
intmain()
}f[i] = maxlen + 1
; }
for (int k = 0; k < 6; k++)
cout
<< f[k] << '';
cout
<}
動態規劃 最長遞增子串行LIS
問題 乙個序列有n個數 a 1 a 2 a n 求出最長非降子串行的長度 樣例輸入 3 1 2 6 5 4 思路 首先把問題簡單化。可以先求a 1 a i 的最長非降子串行,令dp i 為以a i 結尾的最長非降子串行。當i 1 時,明顯是長度dp 1 1 i 2 時,前面沒有比1小的數字,故dp ...
動態規劃之最長遞增子串行LIS
子串行 乙個序列 s 任意刪除若干項,剩餘的序列叫做s的乙個子串行。也可以認為是從序列s按原順序保留任意若干項得到的序列。現在我們要求解乙個陣列裡最長遞增子串行的長度。在此我提出兩種方法,並且附上 解決方法 1 利用動態規劃求解兩個陣列的最長哦公共子串行來求解這種題目,但只適用於求解最長遞增子串行的...
動態規劃 最長遞增子串行問題 LIS
題目 輸出最長遞增子串行的長度,如輸入 4 2 3 1 5 6,輸出 4 因為 2 3 5 6組成了最長遞增子串行 暴力破解法 這種方法很簡單,兩層for迴圈搞定,時間複雜度是o n2 動態規劃 之前我們使用動態規劃去解決一般是建立一維陣列或者二維陣列來構建出dp表,利用之前的歷史上dp表中的值進行...