輸入輸出
輸入樣例
27 6
a b c b d a b
b d c a b a
8 9b a a b a b a b
a b a b b a b b a
輸出case 1
4 lcs(x,y):b c b a
case 2
6 lcs(x,y):a b a b a b
要點分析
設序列x = 和y = 的最長公共子串行為z = ,則
若xm = yn,則zk = xm = yn,且zk-1是xm-1和yn-1的最長公共子串行
若xm≠yn且zk≠xm,則z是xm-1和y的最長公共子串行
若xm≠yn且zk≠yn,則z是x和yn-1的最長公共子串行
由此可見,2個序列的最長公共子串行包含了這2個序列的字首的最長公共子串行。用c[i][j]記錄序列和的最長公共子串行的長度,xi = ;yj = 。當i = 0或j = 0時,空序列是xi和yj的最長公共子串行,此時c[i][j] = 0。
由最優子結構性質可建立關係如下:
列印路徑
而在列印所有的路徑的時候注意:
輸出某條路徑的方法是:
程式**
#include #include #include #include #include using namespace std;
#define size 52
stack s;
char x[size],y[size];
int c[size][size];
int b[size][size];
char path[size];
int curprintn;
int lcs(int m,int n)
else if(c[i-1][j]=c[i][j-1])//up}}
return c[m][n];
}void traceback(int i,int j,int pos)
putchar('\n');
return;
}if(b[i][j]==4)
else if(b[i][j]==2)
else if(b[i][j]==3)
else
}int main()
{ int t,i,ct=0;
scanf("%d",&t);
while(t--)
{int len1,len2;
scanf("%d%d",&len1,&len2);
getchar();
for(i=0; i本文遇到了乙個問題,就是把區域性變數放到了全域性變數的位置。由於在回溯的時候,程式一旦執行其位置pos變數是不可測的,如果設定成全域性變數會導致很大問題,根本無法記錄
在列印所有路徑和列印乙個路徑的區別在於當時設定方向的時候,把可以向上和可以向左的方向設定為一樣,如果設定為不一樣,即告訴程式在這個地方需要跳轉2個方向,直到碰到沒有設定值的0行或0列結束,這樣就可以列印所有的路徑
輸出最長公共子串行
1006 最長公共子串行lcs 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出兩個字串a b,求a與b的最長公共子串行 子串行不要求是連續的 比如兩個串為 abcicba abdkscab ab是兩個串的子串行,abc也是,abca也是,其中abca是這兩個字串最長...
輸出最長公共子串行
試題描述 還是公共子串行,如果不知道什麼叫公共子串行,請先閱讀第0071題。本題給定兩個字串 str1 和 str2 請編寫程式求出這兩個字串最長的公共子串。如果最大長度的公共子串有多個,輸出字典序最小的那乙個。輸入兩行,每行乙個只含英文本母的字串 輸出乙個字串 輸入示例 abcdddbamn bc...
最長公共子串行 列印路徑
一 問題描述 1 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子串行,相應的遞增下標序列為。給定2個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。給定2個序列x 和y...