動態規劃 最長公共子串行

2022-06-04 16:15:07 字數 874 閱讀 6693

有關概念:

最長公共子串行(lcs,longest common subsequence),兩個或者兩個以上序列的所有共同子串行最長的乙個(好像和沒解釋沒什麼區別)

思路:對於兩個序列a,b

f[i][j]表示a序列中1..i的部分和b序列中1...j的部分的lcs

那麼易得,對於f[i][j]:

(1)如果ai!=bj,則從f[i-1][j]和f[i][j-1]中挑選較大的作為前驅,繼承其值;

(2)否則,則使f[i-1][j-1]作為其前驅,繼承其值並++;

最後輸出f[lena][lenb]即可……

當然,可以在更新f[i][j]的時候附帶更新陣列記錄其前驅的位置,以便最後輸出

(我tm都講些什麼東西)

給出陣列**,如果是字串的話,適當改動即可

1 #include2

#define maxn

3int

lena,lenb,a[maxn],b[maxn],ans1,ans2[maxn];

4struct

node

5f[maxn][maxn];

8int

main()9;

18else19;

21else f[i][j]=(node);22}

23}24 printf("

%d\n

",f[lena][lenb].x);

25int x=lena,y=lenb;

26while(x&&y)

2732

for(int i=ans1;i>=1;--i)printf("

%d "

,ans2[i]);

33return0;

34 }

動態規劃 最長公共子串行

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