問題描述
乙個數的序列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).
你的任務,就是對於給定的序列,求出最長上公升子串行的長度。
解題思路
如何把這個問題分解成子問題呢?經過分析,發現 「求以ak(k=1, 2, 3…n)為終點的最長上公升子串行的長度」是個好的子問題――這裡把乙個上公升子串行中最右邊的那個數,稱為該子串行的「終點」。雖然這個子問題和原問題形式上並不完全一樣,但是只要這n個子問題都解決了,那麼這n個子問題的解中,最大的那個就是整個問題的解。
由上所述的子問題只和乙個變數相關,就是數字的位置。因此序列中數的位置k 就是「狀態」,而狀態 k 對應的「值」,就是以ak做為「終點」的最長上公升子串行的長度。這個問題的狀態一共有n個。狀態定義出來後,轉移方程就不難想了。假定maxlen (k)表示以ak做為「終點」的最長上公升子串行的長度,那麼:
maxlen (1) = 1
maxlen (k) = max
seqlen[i]=max+1;
if(seqlen[i]>maxlen) //seqlen中儲存的是第i個數為終點的最長上公升序列,找出這個陣列中最大的值即為最優序列長度
maxlen=seqlen[i];
} printf("%d/n",maxlen);
return 0;
}
2010-11-22 15:13:57
最長上公升子串行 (動態規劃)
描述乙個數的序列 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 等等。...
最長上公升子串行(動態規劃)
描述 乙個數的序列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 等等。這...
最長上公升子串行(動態規劃)
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。你演算法的時間複雜度應該為 o n2 原題跳轉鏈...