乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。若給定序列x=,則x的子串行是指存在乙個嚴格遞增下標序列;例如:序列z=是序列x=的子串行,相應的遞增下標序列為.注意(不一定是連續的)
給定兩個序列x和y,當另一串行z即是x的子串行又是y的子串行時,稱z是x和y的公共子串行。
void
printvector
(vectorint>>
& c)
cout << endl;
} cout << endl;
}int
lcslength
(char
* x,
char
* y,
int i,
int j,vectorint>>
&c,vectorint>>
&s)else
if(c[i]
[j]>0)
return c[i]
[j];
else
else
}return c[i]
[j];}}
void
printitem
(char
* x,
int i,
int j, vectorint>>
& s)
else
if(s[i]
[j]==2)
else
}}
int
nicelcslength
(char
* x,
char
* y,
int m,
int n, vectorint>>
& c,vectorint>>
&s)else
if(c[i-1]
[j]> c[i]
[j-1])
else}}
return c[m]
[n];
}
主程式測試:
int
main()
;char y=
;int mx =
strlen
(x)-1;
int ny =
strlen
(y)-1;
vectorint>> c,s;
c.resize
(mx +1)
; s.
resize
(mx +1)
;for
(int i =
0; i < mx +
1; i++
)//printvector(c);
//int maxlen = lcslength(x, y, mx, ny,c,s);//遞迴
int maxlen =
nicelcslength
(x,y,mx,ny,c,s)
;//非遞迴
printvector
(c);
printvector
(s);
cout << maxlen << endl;
printitem
(x, mx, ny, s)
;return0;
}
動態規劃 最長公共子串行
問題描述 我們稱序列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 的乙...