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