動態規劃 最長公共子串行

2021-07-23 15:29:45 字數 1146 閱讀 4866

動態規劃:動態規劃是一種思想。是由暴力遞迴簡化而來的程式設計思想,在程式設計中變化很大。我的總結如下:

兩個字串的公共子串行。兩個字串str1和str2的公共子串,且為最長的公共子串行。

第一步:我們用dp[i][j]表示str1[0…i]與str2[0…j]的最長公共子串行。

第二步:dp[i][j]一般我們怎麼計算嘞?dp[i][j]的計算可以分兩種情況討論:str1[i]和str2[j]相等,dp[i][j]=dp[i-1][j-1]+1;str1[i]和str2[j]不相等,dp[i][j]取dp[i-1][j]和dp[i][j-1]中最大的。

初值dp[0][0]。

得到dp[i][j]我們要得到dp[i][j]中的最大值,然後根據和dp[i-1][j]和dp[i][j-1]比較確定走哪條路。當前大於左,大於右,選擇當前關鍵元素。看出來沒,選擇最長公共子串行中的元素和計算dp[i][j]的規則有關。

**如下:

public static string lcse(string str1, string str2) 

char chs1 = str1.tochararray();

char chs2 = str2.tochararray();

int dp = getdp(chs1, chs2);

int m = chs1.length - 1;

int n = chs2.length - 1;

char res = new char[dp[m][n]];

int index = res.length - 1;

while (index >= 0) else if (m > 0 && dp[m][n] == dp[m - 1][n]) else

} return string.valueof(res);

} //獲得dp

public static int getdp(char str1, char str2)

for (int j = 1; j < str2.length; j++)

for (int i = 1; i < str1.length; i++)

}} return dp;

} public static void main(string args)

動態規劃 最長公共子串行

問題描述 我們稱序列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 的乙...