最長遞增子序列問題

來源:互聯網
上載者:User

一 問題描述

設序列L = <a1, a2, a3, ..., an>是長度為n的序列,L的一個遞增序列描述為:<ai1, ai2,..., aik>, 其中下標序列 <i1, i2, ..., ik>是

遞增的, 子序列<ai1, ai2, ...., aik> 也是遞增的。此遞增序列的長度為 k

二 解法1, 轉化為LCS問題

先把序列 L 按照從小到大的順序排列, 得到另一個序列S,再求L和S的最長公用子序列

三 解法2,動態規劃

另 len[i] 表示以第 i 個元素結尾的最長遞增子序列的長度,最後求出 max { len[i] } 即可

執行個體 <1, 3, 4, 2, 7>

len[1] = 1, 以1結尾的最長遞增子序列是<1>, 長度為1

len[2] = 2, 以3結尾的最長遞增子序列是<1,3>, 長度為2

len[3] = 3, 以4結尾的最長遞增子序列是<1, 3, 4>, 長度為3

len[4] = 2, 以2結尾的最長遞增子序列是<1, 2>,長度為2

那麼,如何求len[5]呢?轉化為下面的子問題:

第5個元素等於7,找到一個序號在a[5]前面且小於a[5]的元素a[i], 以a[i]結尾的最長遞增子序列加上a[5], 組成一個新的最長遞增子序列,其

長度比原來的多1。比a[5]小的元素有多個(最多4個),那麼得到的遞增子序列也有多個,其中最長的那個就等於以a[5]結尾的最長遞增子序列。

例中,a[3 ]比a[5]小,而且以a[3]結尾的最長遞增子序列是最長的, 故以a[5]結尾的遞增子序列長度在其基礎上加1,等於4

len[5] = 4, 以5結尾的最長遞增子序列是<1,3,4,5>,長度為4

四 解法3,對解法2的改進

解法2中,求len[i]的時候, 要從a[1], ... a[i-1]中找出所有比 a[i] 小的元素,而a[1], ... a[i-1]是無序的。尋找速度比較慢。

引出數組 f[k] 表示長度等於k的遞增子序列中最末尾的元素, 長度越長的序列,其末尾元素也越大,所以f[k]是遞增的。

執行個體 <1, 3, 4, 2, 7>

len[1] = 1, f[1] = a[1] = 1

len[2] = 2, f[2] = a[2] = 3

len[3] = 3, f[3] = a[3] = 4

len[4] = 2, f[2] = a[4] = 2 ( 更新了f[2] )

那麼,如何求len[5] 呢?

f[1] = 1, f[2] = 2, f[3] = 4, a[5] = 7,

找出末尾元素比a[5]小,而且長度最長的遞增子序列,此例中,

f[3] = 4 表示長度等於3的子序列,其末尾元素為4,這個子序列的長度最長。

a[5]加上此序列形成的新序列長度為4, 然後更新f[4] = a[5] = 7,表示長度

等於4的子序列,其末尾元素等於7

在上面的步驟中,找出末尾元素比a[i]小,而且長度最長的子序列,其實就是

對於f[1], ...f[k], 從後往前找,第一個比a[i]小的元素就是長度最長的子序列。尋找的時候

可以用二分尋找方法。故比解法1更快。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.