UVA - 531 Compromise

题目大意:输入两段文字,每段文字以'#'结束,要求你求出这两段文字中最长公共的单词,并输出。

解析:可以当两个字符串相等时进行标记,并递归输出,详见代码。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
const int N = 105;
string s1[N],s2[N];
int dp[N][N];
bool flag[N][N];
int l1,l2;
void print_path(int i,int j) {
	if(i == 0 || j == 0) {
		return ;
	}
	if(flag[i][j]) {
		print_path(i-1,j-1);
		cout << s1[i-1];
		if(dp[i][j] != dp[l1][l2]) {
			cout << " ";
		}
	}else if(dp[i-1][j] > dp[i][j-1]) {
		print_path(i-1,j);
	}else {
		print_path(i,j-1);
	}
}
int main() {
	l1 = l2 = 0;
	while(cin >> s1[l1++]) {
		while(cin >> s1[l1] && s1[l1] != "#") {
			l1++;
		}
		while(cin >> s2[l2] && s2[l2] != "#") {
			l2++;
		}

		memset(dp,0,sizeof(dp));
		memset(flag,false,sizeof(flag));
		for(int i = 1; i <= l1; i++) {
			for(int j = 1; j <= l2; j++) {
				if(s1[i-1] == s2[j-1]) {
					dp[i][j] = dp[i-1][j-1] + 1;
					flag[i][j] = true;
				}else {
					dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
				}
			}
		}
		print_path(l1,l2);
		cout << endl;
		l1 = l2 = 0;
	}
	return 0;
}


你可能感兴趣的:(uva,Compromise,531)