传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1503
题意:给你两个字符串,要你用这两个字符串组成这样一个字符串,在组成的字符串中字符的相对顺序不变的情况下,可以在组成的字符串中找到原先两个字符串,字母可以错开,但是相对顺序不能变化,要这个组成的字符串中字母数最少,并输出这个字符串。
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char s1[105],s2[105]; int dp[105][105],vis[105][105]; int len1,len2; void LCS() { int i,j; for(i=0;i<=len1;i++) vis[i][0]=2; for(i=0;i<=len2;i++) vis[0][i]=3; for(i=1;i<=len1;i++) { for(j=1;j<=len2;j++) { if(s1[i-1]==s2[j-1]) { dp[i][j]=dp[i-1][j-1]+1; vis[i][j]=1; } else if(dp[i-1][j]>dp[i][j-1]) { dp[i][j]=dp[i-1][j]; vis[i][j]=2; } else { dp[i][j]=dp[i][j-1]; vis[i][j]=3; } } } } void Pri(int x,int y) { if(x==0&&y==0) return; if(vis[x][y]==1) { Pri(x-1,y-1); printf("%c",s1[x-1]); } else if(vis[x][y]==2) { Pri(x-1,y); printf("%c",s1[x-1]); } else { Pri(x,y-1); printf("%c",s2[y-1]); } } int main() { while(scanf("%s%s",s1,s2)!=EOF) { for(int i=0;i<105;i++) dp[i][0]=dp[0][i]=0; len1=strlen(s1),len2=strlen(s2); LCS(); Pri(len1,len2); printf("\n"); } return 0; }