Advanced Fruits HDU - 1503(LCS 打印路径)

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


猜你喜欢

转载自blog.csdn.net/Sirius_han/article/details/80356739