問題:
問題:給定2個序列x=和y=,找出x和y的最長公共子串行。子串行和子串的區別:是否連續。
分析:
首先考慮蠻力法,求x和y的所有公共子串行,找出最長的。判斷x乙個子串行是否是y子串行時間o(n),x有2m個子序列,最壞情況下時間複雜度o(n2m)。
考慮使用動態規劃演算法求解:
——建立遞推關係:用c[i][j]記錄序列xi和yj的最長公共子串行的長度。其中,xi=;yj=。建立遞推關係如下:c[i][j] = 0,i=0 or j=0;c[i][j] = c[i-1][j-1] + 1,i>0,j>0,xi=xj;c[i][j] = max,i>0,j>0,xi!=xj;
——計算最優值:設x序列y序列的長度分別是m和n,則子問題共有mn個,搜尋所有的子問題即可,需要記錄最優解的話就需要額外的乙個陣列b[i][j],記錄xi=;yj=是由哪個子問題的解得到的,後續traceback即可。
——構造最優解:根據b[i][j]traceback即可。
**:
#include using namespace std;
#define maxn 105
// 求最優值,即各個子問題最長公共子串行的長度
// 輸入:序列x,y,子問題最優值記錄矩陣c,最優解記錄矩陣b,x長度m,y長度n
void lcs(char x,char y,int c[maxn],int b[maxn],int m,int n)elseelse}}
}}// 根據記錄矩陣b還原最優解
void traceback(int b[maxn],char x,char y,int m,int n)
if(b[m][n]==1){
traceback(b, x, y, m-1, n-1);
cout《時間複雜度為o(mn,僅與問題輸入規模有關)
動態規劃 最長公共子串行
問題描述 我們稱序列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 的乙...