對於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 ...