1. 程式人生 > >動態規劃_線性結構上的DP

動態規劃_線性結構上的DP

【Longest Increasing Subsequence】

最長上升子序列(Longest Increasing Subsequence,LIS),在電腦科學上是指一個序列中最長的單調遞增的子序列。LIS經常用於確定一個代價最小的調整方案,使一個序列變為升序。只需要固定LIS中的元素,調整其他元素即可。

  • 狀態轉移方程:d(i) = max{0, d(j) | j < i,Aj < Ai}+1;
  • 結果:ans = max{d(i)};

【Longest Common Subsequence】

LCS是Longest Common Subsequence的縮寫,即最長公共子序列。一個序列,如果是兩個或多個已知序列的子序列,且是所有子序列中最長的,則為最長公共子序列。

  • 狀態轉移方程:
    d(i,j) = d(i-1,j-1) | s1[i]==s2[j]
    d(i,j) = max{d(i-1,j), d(i, j-1)} | s1[i]!=s2[j]
  • 結果:ans = d(m,n);

【擴充套件1:最優矩陣乘鏈】

一個n*m的矩陣由n行m列共n*m排列而成。兩個矩陣A和B可以相乘當且僅當A的列數等於B的行數。一個n*m的矩陣乘m*p的矩陣,運算量為n*m*p。
   矩陣乘法不滿足分配律,但滿足結合律。因此A*B*C既可以按順序(A*B)C也可以按A(B*C)來進行。假設A、B、C分別是2*3、3*4、4*5的,則(A*B)C運算量是2*3*4+2*4*5=64,A

(B*C)的運算量是3*4*5*2*3*5=90.顯然第一種順序節省運算量。
   給出n個矩陣組成的序列,設計一種方法把他們依次乘起來,使得總的運算量儘量小。假設第i個矩陣A[i]是P[i-1]*P[i]的。

  • 動態規劃的特點:區域性最優。故尋找子序列最優即可。(前提是正確性的證明。)
  • 狀態轉移方程:f(i,j) = min{ f(i, k)+f(k+1, j) + p[i-1]p[k]p[j] }。

【擴充套件2:最優三角剖分】

用多邊形頂點的逆時針序列表示凸多邊形,即P={v0,v1,…,vn-1}表示具有n條邊的凸多邊形。
  給定凸多邊形P,以及定義在由多邊形的邊和絃組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得即該三角剖分中諸三角形上權之和為最小。

  • 尋找區域性最優解。
  • d(i,j) = max{ d(i,k) + d(k,j) + w(i,j,k) | i< k< j }

動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。
與分治法不同的是,適合於用動態規劃求解的問題,經分解得到子問題往往不是互相獨立的。若用分治法來解這類問題,則分解得到的子問題數目太多,有些子問題被重複計算了很多次。如果我們能夠儲存已解決的子問題的答案,而在需要時再找出已求得的答案,這樣就可以避免大量的重複計算,節省時間。我們可以用一個表來記錄所有已解的子問題的答案。不管該子問題以後是否被用到,只要它被計算過,就將其結果填入表中。這就是動態規劃法的基本思路。具體的動態規劃演算法多種多樣,但它們具有相同的填表格式。