[英]how to print longest common subsequence?
我正在學習lcs並實現它..但是找不到打印最長公共子序列的方法..如何打印它?
我的lcs代碼
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int dp[1005][1005];
char a[1005],b[1005];
int lcs(int x,int y)
{
if(x==strlen(a)||y==strlen(b))
return 0;
if(dp[x][y]!=-1)
return dp[x][y];
else if(a[x]==b[y])
dp[x][y]=1+lcs(x+1,y+1);
else
dp[x][y]=max(lcs(x+1,y),lcs(x,y+1));
return dp[x][y];
}
int main()
{
while(gets(a)&&gets(b))
{
memset(dp,-1,sizeof(dp));
int ret=lcs(0,0);
printf("%d\n",ret);
}
}
當您想要恢復最佳解決方案時,使用dp的典型方法 - 添加第二個數組,其大小與您記憶中的數量完全相同,並在其中存儲您決定采用的“路徑”。 在這種情況下,您決定采用“路徑”,我指的是通向最佳解決方案的分支。
看看你實現LCS的方式,你有三個lcs(x, y)
選項:
1+lcs(x+1,y+1);
時,可以達到最佳效果1+lcs(x+1,y+1);
即你包括來自a
元素x
和來自b的元素y
。 x
從a
。 如果你得到dp[x][y]=max(lcs(x+1,y),lcs(x,y+1));
就會發生這種情況dp[x][y]=max(lcs(x+1,y),lcs(x,y+1));
事實上, lcs(x+1, y)
是兩個值中較大的一個。 b
元素y
。 如果你得到dp[x][y]=max(lcs(x+1,y),lcs(x,y+1));
就會發生這種情況dp[x][y]=max(lcs(x+1,y),lcs(x,y+1));
實際上lcs(x, y+1)
是兩個值中較大的一個。 兩個最低的項目符號意味着您必須將此最大語句拆分為兩個ifs。
現在存儲為每對(x,y)
選擇的三個選擇中的哪一個並重建最佳解決方案應該非常簡單。
void traceback(int i, int j){
if(i == 0|| j == 0)return;
if(a[i-1] == b[j-1]) {
traceback(i-1, j-1);
cout << a[i-1];
}
else if( dp[ i ][ j ] > max(dp[ i-1][ j ],dp[ i ][ j-i ] );
traceback(i,j-1);
}
這將以相反的順序打印序列,因此可以使用數組實現正確的順序...
我剛用過它,它對我有用..
void traceback(int i, int j){
if(i == 0|| j == 0)return;
if(a[i-1] == b[j-1]) {
traceback(i-1, j-1);
cout << a[i-1];
}
else if(dp[i-1][j] > dp[i][j-1])
traceback(i-1, j);
else traceback(i, j-1);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.