/* 题意:将两个字符串结合起来,他们的公共子串只输出一次 思路:根据LCS的原理,将每个字符都进行标记,看两个字符串中对应的字符究竟处于什么状态, 然后输出,其标记为公共子串的字符只输出一次即可 */ # include <stdio.h> # include <algorithm> # include <iostream> # include <string.h> using namespace std; int dp[110][110],pre[110][110]; char a[110],b[110]; void slove(int i,int j) { if(i==0&&j==0) return ; if(pre[i][j]==1) { slove(i-1,j-1); printf("%c",a[i-1]); } else if(pre[i][j]==2) { slove(i-1,j); printf("%c",a[i-1]); } else { slove(i,j-1); printf("%c",b[j-1]); } } int main() { int i,j,lena,lenb; while(~scanf("%s %s",a,b)) { lena=strlen(a); lenb=strlen(b); memset(dp,0,sizeof(dp)); memset(pre,0,sizeof(pre)); for(i=0; i<=lenb; i++) pre[0][i]=3; for(i=0; i<=lena; i++) pre[i][0]=2; for(i=1; i<=lena; i++) { for(j=1; j<=lenb; j++) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; pre[i][j]=1; } else { if(dp[i-1][j]>dp[i][j-1]) dp[i][j]=dp[i-1][j],pre[i][j]=2; else dp[i][j]=dp[i][j-1],pre[i][j]=3; } } } slove(lena,lenb); printf("\n"); } return 0; }
hdu 1503 Advanced Fruits (LCS)
原文:http://blog.csdn.net/lp_opai/article/details/43561725