Advanced Fruits
HDU - 1503题意:给出两个字符串, 要求将两个字符串合并 ,如果两个字符串有公共字符, 那么这个公共字符只输出一次, 使得合并后的字符串最短但又包含两个字符串的全部字符;
就是求LCS的路径
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; string a, b; int dp[110][110], mark[110][110]; void print(int x, int y){ if(x==0&&y==0) return; if(mark[x][y]==0){ print(x-1, y-1); printf("%c", a[x-1]); } else if(mark[x][y]==1){ print(x-1, y); printf("%c", a[x-1]); } else{ print(x, y-1); printf("%c", b[y-1]); } } int main(){ while(cin >> a >> b){ int n, m; n=a.size(); m=b.size(); for(int i=0; i<=n; i++){ for(int j=0; j<=m; j++){ if(i==0) dp[i][j]=0, mark[i][j]=-1; else if(j==0) dp[i][j]=0, mark[i][j]=1; else{ if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1, mark[i][j]=0; else if(dp[i-1][j]>dp[i][j-1]){ dp[i][j]=dp[i-1][j]; mark[i][j]=1; } else{ dp[i][j]=dp[i][j-1]; mark[i][j]=-1; } } } } print(n, m); printf("\n"); } return 0; }