ACM最長公共子串行問題(動態規劃)C 實現

2021-08-26 10:08:48 字數 1260 閱讀 1099

對於x=x1x2...xm, y=y1y2...yn的最長公共子串行z=z1z2...zk

1)、如果xm=yn,那麼zk=xm=yn,且zk-1是xm-1和yn-1的乙個lcs

2)、如果xm!=yn,那麼zk!=xm蘊含z是xm-1和y的乙個lcs

3)、如果xm!=yn,那麼zk!=yn蘊含z是x和yn-1的乙個lcs

最長公共子串行的長度

#include "stdafx.h"

#include

#define n 1000

using namespace std;

//str1儲存字串1,str2儲存字串2

char str1[n],str2[n];

//lcs儲存最長公共子串行

char lcs[n];

//c[i][j]儲存str1[1...i]與str2[1...j]的最長公共子串行的長度

int c[n][n];

//flag[i][j]標記是那種子問題

//flag[i][j]==0為str1[i]==str2[j]

//flag[i][j]==1為c[i-1][j]>=s[i][j-1]

//flag[i][j]==-1為c[i-1][j] //

int getlcslength(const char *s1, const char *s2)

else if(c[i-1][j]>=c[i][j-1])

else

}return c[len1][len2];}

char* getlcs(const char *s1, const char *s2,int len,char *lcs)

else if(flag[i][j]==1)

i--;

else

j--;

}return lcs;}

int _tmain(int argc, _tchar* argv)

{int cases;

cout

while(cases--)

{int i;

cout

cout

int lcslen = getlcslength(str1,str2);

cout<

請輸入案例的個數:

1請輸入字串1:

abcbdab

請輸入字串2:

bdcaba

最長公共子串行長度:4

最長公共子串行為:

bcba

請按任意鍵繼續. . .

最長公共子串行問題 最長公共子串問題 動態規劃

longest common subsequence problem 序列x和y,找到z為x和y的最大公共子串行 蠻力列舉 從x的長度為1序列開始列舉,在y中查詢是否有該序列 列舉觀察,長度為x 1的子串行是長度為x的子串行的一部分 存在最優子結構和重疊子問題,適合動態規劃 1 問題結構分析 c i...

ACM 最長公共子串行

和最長公共子串區別的地方在於它的位置不要求是連續的。不過求解的思路和最長公共子串差不太多,同樣用c儲存狀態,但是轉移方程為 如果s1 i s2 j 則c i j c i 1 j 1 1 如果s1 i s2 j 則c i j max 也就是,如果不相等,那麼取max include include i...

ACM最長公共子串行問題(動態規劃)C 實現

對於x x1x2.xm,y y1y2.yn的最長公共子串行z z1z2.zk 1 如果xm yn,那麼zk xm yn,且zk 1是xm 1和yn 1的乙個lcs 2 如果xm!yn,那麼zk!xm蘊含z是xm 1和y的乙個lcs 3 如果xm!yn,那麼zk!yn蘊含z是x和yn 1的乙個lcs ...