1. 程式人生 > 其它 >9.4 更多經典模型

9.4 更多經典模型

yes,dp差不多隻剩下最後一章的掃尾工作了,加油!
本節將介紹一些常見結構中的動態規劃,序列,表示式,凸多邊形和樹。儘管他們的形式和解法千差萬別,但都用到了動態規劃的思想:從複雜的題目背景中抽象出狀態表示,然後設計他們之間的轉移。

9.4.1 線性結構上的動態規劃

最長上升子序列問題(LIS)

設d(i)為以i結尾的最長上升子序列的長度,則d(i) = max{0, d(j)|j<i, Aj<Ai}+1,最終答案是max{d(i)},如果LIS中的相鄰元素可以相等,把小於號改成小於等於號即可。上述演算法的時間複雜度為O(n*n)

最長上升子序列問題複雜度為O(nlogn)的揭發思路大致是這樣的
1.d[i]此時表示的不再是第i個數的最長上升子序列的值,而是表示長度為i的上升子序列的最後一個數的最小值(貪心的思想,在相同長度的情況下,肯定是長度越小其更優秀,因為這樣更可能為後面的數字拼接搭建橋樑,也就是說如果現在有兩個子序列1,2,3和2,3,4很明顯d[3] = 3而不是4,因為無論後面的數字怎麼樣,肯定是相同長度下的最後一個數字越小越好

最長公共子序列問題(LCS)
最長公共子序列在一些特殊情況下可以轉換為最長上升子序列問題
筆者是這樣考慮的,首先我們不妨假設上下兩個陣列一個是num1,一個是num2
那麼我們就可以為構建一個關係,讓num1[i]對映到i上,然後此時num2上的數字只有出現num1上的數字那麼就會有獨一無二的i與其對應(如果有重複的情況,依次分配值,無法非陪就給予INF
其他不在num1之間的情況,那麼我們的賦值也是INF
這樣我們就可以將原先的num2上的數字轉換成對應的num1上的下標,此時最長公共子序列問題就轉換成了最長上升子序列問題,很明顯,其時間複雜度為O(nlogn)

作者是這樣給出的解答:
設d(i,j)為A1,A2,...,Ai和B1,B2和Bj的LCS的長度,則當A[i]=A[j]的時候,d(i,j) = d(i-1,j-1)+1,否則d(i,j) = max{d(i-1,j), d(i,j-1)}
時間複雜度為O(nm),其中n和m分別是序列A和B的長度

Lighting_System_Design