動態規劃 之 最長上公升子串行

2021-07-23 15:38:12 字數 1020 閱讀 1532

乙個數的序列bi,當b1 < b2 < ... < bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列(a1, a2, ..., an),我們可以得到一些上公升的子串行(ai1, ai2, ..., aik),這裡1 <= i1 < i2 < ... < ik <= n。比如,對於序列(1, 7, 3, 5, 9, 4, 8),有它的一些上公升子串行,如(1, 7), (3, 4, 8)等等。這些子串行中最長的長度是4,比如子串行(1, 3, 5, 8). 

你的任務,就是對於給定的序列,求出最長上公升子串行的長度。

輸入資料

輸入的第一行是序列的長度n (1 <= n <= 1000)。第二行給出序列中的n個整數,這些整數的取值範圍都在0到10000。

輸出要求

最長上公升子串行的長度。

輸入樣例

71 7 3 5 9 4 8

輸出樣例

4如何把這個問題分解成子問題呢?經過分析,發現 「求以ak(k=1, 2, 3…n)為終點的最長上公升子串行的長度」是個好的子問題――這裡把乙個上公升子串行中最右邊的那個數,稱為該子串行的「終點」。雖然這個子問題和原問題形式上並不完全一樣,但是只要這n個子問題都解決了,那麼這n個子問題的解中,最大的那個就是整個問題的解。

由上所述的子問題只和乙個變數相關,就是數字的位置。因此序列中數的位置k 就是「狀態」,而狀態 k 對應的「值」,就是以ak做為「終點」的最長上公升子串行的長度。這個問題的狀態一共有n個。狀態定義出來後,轉移方程就不難想了。假定maxlen (k)表示以ak做為「終點」的最長上公升子串行的長度,那麼:

maxlen (1) = 1

maxlen (k) = max

} amaxlen[i] = ntmp + 1;

} int nmax = -1;

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

if( nmax < amaxlen[i])

nmax = amaxlen[i];

printf("%d\n", nmax);

}試圖列舉全部上公升子串行,然後在其中尋找最長的乙個,導致超時錯。

動態規劃之最長上公升子串行

北大郭煒老師講的能採用動態規劃求解問題的特點 1 問題具有最優子結構的性質 2 無後效性。實現動態規劃的三個步驟 1 講原問題分解為子問題 2 確定狀態以及初始狀態 邊界值 3 狀態轉移方程 人人為我 遞推型 第一步的子問題就是a i 為終點的最長上公升子串行。include includeusin...

動態規劃之最長上公升子串行

動態規劃指的是將乙個繁雜的問題分解成子問題之後,通過求解子問題的最優解,從而求得整體最優解。輸入資料 輸入的第一行是序列的長度n 1 n 1000 第一行給出序列的n個整數,這些整數的取值範圍在0 10000.輸出要求 最長上公升子串行的長度。輸入樣例 7 1 7 3 5 9 4 8 輸出樣例 範例...

動態規劃學習之最長上公升子串行

這個問題的關鍵是建立狀態方程dp i 儲存演算法a i 為終點的最長上公升子串行的長度,那麼dp i 的解題思路就是從前面找到比a i 小,並且具有最大dp j 0 j i 1 的j,並且在後面接上的a i 因此方程為 dp i dp j 1 0 j i 1 max dp j 除此之外,因為都是從比...