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;
}