[POJ 1934] Trip
[题目链接]
http://poj.org/problem?id=1934
[算法]
先用dp求出LCS,然后搜索即可,注意加上一些剪枝
[代码]
#include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <exception> #include <fstream> #include <functional> #include <limits> #include <list> #include <map> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stdexcept> #include <streambuf> #include <string> #include <utility> #include <vector> #include <cwchar> #include <cwctype> #include <stack> #include <limits.h> using namespace std; #define MAXLEN 85 int i,j,la,lb,len,l; string a,b; int f[MAXLEN][MAXLEN],pa[MAXLEN][MAXLEN],pb[MAXLEN][MAXLEN]; string q[1010]; inline void dfs(int dep,int pos1,int pos2,string t) { int i; if (dep > len) q[++l] = t; if (pos1 < 0 || pos2 < 0) return; if (f[pos1][pos2] != len - dep + 1) return; if (dep + pos1 < len || dep + pos2 < len) return; if (l >= 1000) return; for (i = 0; i < 26; i++) { if (l >= 1000) return; if (pa[i][pos1] != -1 && pb[i][pos2] != -1) dfs(dep + 1,pa[i][pos1] - 1,pb[i][pos2] - 1,(char)(i + 'a') + t); } } int main() { cin.tie(0); ios :: sync_with_stdio(0); while (cin >> a) { cin >> b; la = a.size(); lb = b.size(); for (i = 0; i < la; i++) { for (j = 0; j < lb; j++) { f[i][j] = 0; } } for (i = 0; i < la; i++) { for (j = 0; j < lb; j++) { if (a[i] == b[j]) { if (i >= 1 && j >= 1) f[i][j] = f[i - 1][j - 1] + 1; else f[i][j] = (a[i] == b[j]); } if (i >= 1) f[i][j] = max(f[i][j],f[i - 1][j]); if (j >= 1) f[i][j] = max(f[i][j],f[i][j - 1]); } } for (i = 0; i < 26; i++) { for (j = 0; j < la; j++) { pa[i][j] = -1; } } for (i = 0; i < 26; i++) { for (j = 0; j < la; j++) { if (a[j] == 'a' + i) pa[i][j] = j; else if (j > 0) pa[i][j] = pa[i][j - 1]; } } for (i = 0; i < 26; i++) { for (j = 0; j < lb; j++) { pb[i][j] = -1; } } for (i = 0; i < 26; i++) { for (j = 0; j < lb; j++) { if (b[j] == 'a' + i) pb[i][j] = j; else if (j > 0) pb[i][j] = pb[i][j - 1]; } } len = f[la - 1][lb - 1]; l = 0; dfs(1,la - 1,lb - 1,""); sort(q+1,q+l+1); for (i = 1; i <= l; i++) cout<< q[i] << endl; } return 0; }