531

最长公共子序列,只不过里面的字母换成单词了,做法是一样的,用的算法导论上的输出方法,输出的时间效率是O(m+n)的,还挺快

//============================================================================
// Name        : 531.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;


string s1[200], s2[200], s;
int num1, num2, ans, t;
int c[200][200], b[200][200];


void Print(int i, int j){
	if(i == 0||j == 0) return;
	if(b[i][j] == 0){
		Print(i-1, j-1);
		t++;
		if(t == ans) cout << s1[i] << endl;
		else cout << s1[i] << " ";
	}
	else if(b[i][j] == 1){
		Print(i-1, j);
	}
	else Print(i, j-1);
}



int main() {
	freopen("a.txt", "r", stdin);
	while(cin >> s){
		memset(b, 0, sizeof(b));
		memset(c, 0, sizeof(c));
		num1 = 0;
		num2 = 0;
		s1[++num1] = s;
		while(cin >> s&&s != "#"){
			s1[++num1] = s;
		}
		while(cin >> s&& s != "#"){
			s2[++num2] = s;
		}
		ans = 0;
		for(int i = 0;i <= num1;i++) c[i][0] = 0;
		for(int j = 0;j <= num2;j++) c[0][j] = 0;
		for(int i = 1;i <= num1;i++){
			for(int j = 1;j <= num2;j++){
				if(s1[i] == s2[j]){
					c[i][j] = c[i-1][j-1]+1;
					b[i][j] = 0;
				}
				else if(c[i-1][j] >= c[i][j-1]){
					c[i][j] = c[i-1][j];
					b[i][j] = 1;
				}
				else{
					c[i][j] = c[i][j-1];
					b[i][j] = -1;
				}
				if(ans < c[i][j]){
					ans = c[i][j];
				}
			}
		}
		t = 0;
		Print(num1, num2);
	}
	return 0;
}

posted @ 2011-05-26 21:33  KOKO's  阅读(329)  评论(0编辑  收藏  举报