1. 程式人生 > >51nod 1006 最長公共子序列Lcs(dp+string,無標記數組實現)

51nod 1006 最長公共子序列Lcs(dp+string,無標記數組實現)

轉移 opened mes star 字符 tex src 表示 logs

1006 最長公共子序列Lcs技術分享 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 技術分享 收藏 技術分享 關註 技術分享 取消關註 給出兩個字符串A B,求A與B的最長公共子序列(子序列不要求是連續的)。 比如兩個串為: abcicba abdkscab ab是兩個串的子序列,abc也是,abca也是,其中abca是這兩個字符串最長的子序列。 Input
第1行:字符串A
第2行:字符串B
(A,B的長度 <= 1000)
Output
輸出最長的子序列,如果有多個,隨意輸出1個。
Input示例
abcicba
abdkscab
Output示例
abca


設dp[i][j]表示字符串a的前i個字符與字符串b的前j個字符的最長公共子序列長度。
狀態轉移方程:dp[i][j]=a[i-1]==b[j-1]?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]);
邊界條件dp[0][x]=dp[x][0]=0;

技術分享
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 int dp[1005][1005]={0};
 5 string a,b;
 6 int la,lb;
 7 void lcs(int n,int m)
 8
{ 9 for(int i=1;i<=n;i++) 10 for(int j=1;j<=m;j++) 11 dp[i][j]=a[i-1]==b[j-1]?dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]); 12 } 13 void output() 14 { 15 string ans; 16 int i=la,j=lb,len=dp[la][lb]; 17 while(dp[i][j]) 18 { 19 if(a[i-1]==b[j-1]) 20 ans.push_back(a[i-1
]),i--,j--; 21 else if(dp[i][j]==dp[i-1][j]) 22 i--; 23 else if(dp[i][j]==dp[i][j-1]) 24 j--; 25 } 26 for(int i=len-1;i>=0;i--) 27 cout<<ans[i]; 28 cout<<endl; 29 } 30 int main() 31 { 32 ios::sync_with_stdio(false); 33 cin>>a>>b; 34 la=a.size(),lb=b.size(); 35 lcs(la,lb); 36 output(); 37 return 0; 38 }
View Code

51nod 1006 最長公共子序列Lcs(dp+string,無標記數組實現)