動態規劃與序列問題

2021-07-02 01:18:31 字數 2381 閱讀 3718

1.最長公共子串問題描述

如果字串一的所有字元按其在字串中的順序出現在另外乙個字串二中,則字串一稱之為字串二的子串。注意,並不要求子串(字串一)的字元必須連續出現在字串二中。

動態規劃

使用dp[i][j]表示 以x[i]和y[j]結尾的最長公共子串的長度,因為要求子串連續,所以對於x[i]與y[j]來講,它們要麼與之前的公共子串構成新的公共子串;要麼就是不構成公共子串。故狀態轉移方程 x[i] == y[j],dp[i][j] = dp[i-1][j-1] + 1 x[i] != y[j],dp[i][j] = 0 對於初始化,i==0或者j==0,如果x[i] == y[j],dp[i][j] = 1;否則dp[i][j] = 0。這樣的處理跟連續子陣列最大和有點類似,只是連續子陣列子和是當dp[i]<0時執行dp[i]=0。

2.最長公共子串行(lcs)

問題描述

最長公共子串行就是尋找兩個給定序列的子串行,該子串行在兩個序列中以相同的順序出現,但是不必要是連續的。

動態規劃求解

使用動態規劃求解這個問題,先尋找最優子結構。設x=1,x2

,…,x

m>和y=1,y2

,…,y

n>為兩個序列,lcs(x,y)表示x和y的乙個最長公共子串行,可以看出

如果xm=yn,則lcs ( x,y ) = xm + lcs ( xm-1,yn-1 )。

如果xm!=yn,則lcs( x,y )= max

lcs問題也具有重疊子問題性質:為找出x和y的乙個lcs,可能需要找x和yn-1的乙個lcs以及xm-1和y的乙個lcs。但這兩個子問題都包含著找xm-1和yn-1的乙個lcs,等等。

為了找到最長的lcs,我們定義dp[i][j]記錄序列lcs的長度,合法狀態的初始值為當序列x的長度為0或y的長度為0,公共子串行lcs長度為0,即dp[i][j]=0,所以用i和j分別表示序列x的長度和序列y的長度,狀態轉移方程為dp[i][j] = 0 如果i=0或j=0dp[i][j] = dp[i-1][j-1] + 1 如果x[i-1] = y[i-1]dp[i][j] = max 如果x[i-1] != y[i-1]求出了最長公共子串行的長度後,輸出lcs就是輸出dp的最優方案了,既可以用乙個額外的矩陣儲存路徑,也可以直接根據狀態轉移矩陣倒推最優方案。

3.字串編輯距離

問題描述

1)修改乙個字元

2)增加乙個字元

3)刪除乙個字元

尋找子問題時,我們完全可以像分析最長公共子串行那樣分析這個問題,都是「從後向前」看,假設有兩個串x=abcdaex,y=fdfax,它們的最後乙個字元是相同的,只要計算x[1,…,6]=abcdae和y[1,…,4]=fdfa的距離就可以了;但是如果兩個串的最後乙個字元不相同,那麼就可以進行如下的操作來達到目的(xlen和ylen是x串和y串的長度):

1.一步操作之後,再計算x[1,…,xlen-1]和y[1,…ylen]的距離。這個操作可以是刪除x的最後乙個字元,也可以是增加x串的最後乙個字元到y串的最後字元之後

2.一步操作之後,再計算x[1,…,xlen]和y[1,…ylen-1]的距離。這個操作與情況1類似,反過來而已

3.一步操作之後,再計算x[1,…,xlen-1]和y[1,…ylen-1]的距離。這個操作可以是修改x串的最後有乙個字元為y串的最後乙個字元,後者修改y的變為x的最後乙個字元,使得二者相同。  

dp[i][j]中的i和j表示串x和y的長度,其中,如果某乙個串的長度為0,則編輯距離就是另乙個串的長度,這很容易理解。狀態轉移方程為

1.dp[i][j] = 0  如果i=0 & j=0

2.dp[i][j] = xlen | ylen  如果j=0 | i=0

3.dp[i][j] = dp[i-1][j-1]  如果x[i-1] = y[i-1]

4.dp[i][j] = 1 + min  如果x[i-1] != y[i-1]

4.最大連續子串行和

最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 ,它的和是8,達到最大;而 的最大子串行是,它的和是6。你已經看出來了,找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子串行的和,最後找到和最大的子串行。

5.最長遞增子串行(lis)像lcs一樣,從後向前分析,很容易想到,第i個元素之前的最長遞增子串行的長度要麼是1(單獨成乙個序列),要麼就是第i-1個元素之前的最長遞增子串行加1,可以有狀態方程:

lis[i] = max,其中,對於任意的k<=i-1,arr[i] > arr[k],這樣arr[i]才能在arr[k]的基礎上構成乙個新的遞增子串行。

動態規劃 最長子序列問題

最長公共子串行 x和y的公共子串行中長度最長的 包含元素最多的 叫做x和y的最長公共子串行。思路 設x x1x2 xm和y y1y2 yn是兩個序列,z z1z2 zk是這兩個序列的乙個最長公共子串行。1.如果xm yn,那麼zk xm yn,且zk 1是xm 1,yn 1的乙個最長公共子串行 2....

動態規劃解各種子串行問題

1 最長公共序列 lcs include include using namespace std define up 1 define left 2 define slope 3 int dp 50 50 int road 50 50 char a algorithm char b altruist...

最大子串行和問題(動態規劃)

1.問題詳解 輸入一組整數,求出這組數字子串行和中最大值。也就是只要求出最大子串行的和。例如 序列 2 11 4 13 5 2,則最大子串行和為20。序列 6 2 4 7 5 3 2 1 6 9 10 2,則最大子串行和為16。2.解決辦法 這一類題目我們通常採用動態規劃來解決,即可以通過一次遍歷完...