動態規劃 最長公共子串行

2021-07-11 21:58:41 字數 1625 閱讀 2423

題目描述:

兩個字串如"programming"和"contest"的最長公共子串行為「on」,長度為2;

「abcd」和"mnp"的最長公共子串行為"",長度為0;

"bcdb"和「abcbdab」的最長公共子串為「bcdb」,長度為4;

注:相應的下標必須遞增。如"bcdb"對應「abcbdab」的下標為;

遞推關係:

設序列x=和y=的最長公共子串行為z=。則有:

(1)若xm=yn,則zk=xm=yn,且zk-1是xm-1和yn-1的最長公共子串行。

(2)若xm!=yn且zk!=xm,則z是xm-1和y的最長公共子串行。

(3)若xm!=yn且zk!=yn,則z是x和yn-1的最長公共子串行。

其中,xm-1=,yn-1=,zk-1=。

**:構造最優解

:由以上分析可知,要找出x=和y=的最長公共子串行,可以按以下方式遞迴進行:當xm=y

n時,找出x

m-1和y

n-1的最長公共子串行,然後在尾部加上x

m(=y

n)即可得x和y的最長公共子串行。當x

m!=y

n時,必須解兩個子問題,即找出x

m-1和y的乙個最長公共子串行及x和y

n-1的乙個最長公共子串行。這兩個公共子串行中較長者為x和y的最長公共子串行。設陣列path[i][j]記錄matrix[i][j]的值由哪乙個子問題的解得到的,從path[m][n]開始,依其值在陣列b中搜尋,當path[i][j]=1時,表示xi和y

j的最長公共子串行是由x

i-1和y

j-1的最長公共子串行在尾部加上x

i所得到的子串行。當path[i][j]=2時,表示xi和y

j的最長公共子串行與x

i-1和y

j的最長公共子串行相同。當path[i][j]=3時,表示xi和y

j的最長公共子串行與xi和y

j-1的最長公共子串行相同。

//遞迴方法

public int maxlen(string str1,string str2,int i,int j)

if(str1.charat(i-1)==str2.charat(j-1))//字元下標從0開始;

return maxlen(str1,str2,i-1,j-1)+1;

else

}//dp_自底向上的方式;matrix[m][n]存放長度為m和n的字串的最長子串值;

public int maxlen_dp(string str1,string str2,int m,int n)

else

else}}

} return matrix[m][n];

} //構造最優解,用乙個矩陣path存放路徑;

//進行不同的路徑選擇時分別設為狀態1,2,3;

int path=new int[13][13];

//構造最優解的函式;

public void lcs(string str1,int path,int i,int j)

else if(path[i][j]==3)

else if(path[i][j]==2)

}

動態規劃 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要...

動態規劃 最長公共子串行

兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...

動態規劃 最長公共子串行

看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...