hdu 1503 最长公共子序列
2014-11-20 00:14
239 查看
/* 给两个串a,b。输出一个最短的串(含等于a的子序列且含等于b的子序列) */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=105; int dp[maxn][maxn],path[maxn][maxn]; int len,len1,len2; char text[maxn],a[maxn],b[maxn]; void getpath() { int n=len,i=len1,j=len2; while(n) { if(path[i][j]==0) text[n--]=a[i],i--,j--; else if(path[i][j]==1) i--; else j--; } } int main() { int i,j,k; a[0]=b[0]='0'; while(~scanf("%s%s",a+1,b+1)) { memset(dp,0,sizeof(dp)); len1=strlen(a)-1,len2=strlen(b)-1; for(i=1;i<=len1;i++) { for(j=1;j<=len2;j++) { if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1,path[i][j]=0; else { if(dp[i-1][j]>dp[i][j-1]) dp[i][j]=dp[i-1][j],path[i][j]=1; else dp[i][j]=dp[i][j-1],path[i][j]=2; } } } len=dp[len1][len2]; getpath(); j=1,k=1; for(i=1;i<=len;i++) { while(a[j]!=text[i]) printf("%c",a[j++]); while(b[k]!=text[i]) printf("%c",b[k++]); printf("%c",text[i]); j++;k++; } while(j<=len1) printf("%c",a[j++]); while(k<=len2) printf("%c",b[k++]); printf("\n"); } return 0; }
相关文章推荐
- hdu 1503(最长公共子序列的升级版)
- hdu 1503 Advanced Fruits(最长公共子序列的应用)
- hdu 1503 Advanced Fruits(最长公共子序列+路径记录)
- HDU 1503(Advanced Fruits)最长公共子序列+路径记录
- HDU-1503(最长公共子序列加强版)
- hdu 1503 最长公共子序列变型
- hdu 1503 Advanced Fruits(最长公共子序列)
- hdu 1503 最长公共子序列
- HDU-1503(最长公共子序列+路径跟踪)
- 最长公共子序列(加强版) Hdu 1503 Advanced Fruits
- hdu 1503 Advanced Fruits(最长公共子序列变形)
- HDU 1503 最长公共子序列的变形(重点在输出)
- 最长公共子序列 HDU 1159/1080/1503
- HDU 1503 Advanced Fruits(还原最长公共子序列、记录路径)
- HDU 1503 Advanced Fruits (LCS最长公共子序列)
- hdu 1503(最长公共子序列的升级版)
- hdu 1503:Advanced Fruits(动态规划 DP & 最长公共子序列(LCS)问题升级版)
- HDU 1503 Advanced Fruits 最长公共子串应用(LCS算法应用)
- hdu 1159 最长公共子序列
- HDU 1503 Advanced Fruits