• [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;
        
    }
  • 相关阅读:
    [LeetCode] 56. Merge Intervals 解题思路
    [LeetCode] 128. Longest Consecutive Sequence 解题思路
    [LeetCode] Subsets I (78) & II (90) 解题思路,即全组合算法
    linux安装PHP7以及扩展
    php安装composer
    细说PHP中strlen和mb_strlen的区别
    mysql一些简单操作
    mysql数据库使用Navicat时向Navicat导入sql文件时某字段过大时的处理
    JS中||的某些用法
    PHP验证身份信息
  • 原文地址:https://www.cnblogs.com/evenbao/p/9350393.html
Copyright © 2020-2023  润新知