zoukankan      html  css  js  c++  java
  • [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;
        
    }
  • 相关阅读:
    [网络流24题] 深海机器人问题
    [网络流24题] 数字梯形问题
    处理银行卡号的格式
    每天十点的倒计时
    HTML meta标签总结与属性使用介绍
    禁止的一些操作
    input输入大于0的小数和整数
    cf 1037D BFS
    cf 1051F 树+图
    cf 911F 树的直径+贪心
  • 原文地址:https://www.cnblogs.com/evenbao/p/9350393.html
Copyright © 2011-2022 走看看