zoukankan      html  css  js  c++  java
  • HDU 4681 String 最长公共子序列

    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=4681

    题意:

    给你a,b,c三个串,构造一个d串使得d是a,b的子序列,并且c是d的连续子串。求d最大的长度。

    题解:

    枚举a,b串开始匹配c的位置,(结束的位置可以贪心出来),然后前后都用最长公共子序列来跑就可以了。

    O(n^2)预处理,O(n^2)枚举。

    #pragma comment(linker, "/STACK:102400000,102400000") 
    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    typedef long long LL;
    const int maxn = 1111;
    
    char sa[maxn], sb[maxn], sc[maxn];
    int dp1[maxn][maxn], dp2[maxn][maxn];
    
    int pa[maxn], pb[maxn];
    void get_p(char* ss, int* pp) {
        memset(pp, -1, sizeof(int)*maxn);
    
        int lss = strlen(ss),lsc=strlen(sc);
        for (int i = 0; i < lss; i++) {
            int k = 0,j;
            for (j = i; j < lss; j++) {
                if (k == lsc) break;
                if (sc[k] == ss[j]) {
                    k++;
                }
            }
            if (k == lsc){
                pp[i] = j - 1;
            }
        }
    }
    
    void init() {
        memset(dp1, 0, sizeof(dp1));
        memset(dp2, 0, sizeof(dp2));
    }
    
    int main() {
        int tc,kase=0;
        scanf("%d", &tc);
        while (tc--) {
            init();
            scanf("%s%s%s", sa, sb, sc);
            get_p(sa, pa), get_p(sb, pb);
            int la = strlen(sa), lb = strlen(sb),lc=strlen(sc);
            for (int i = 0; i < la; i++) {
                for (int j = 0; j < lb; j++) {
                    if (sa[i] == sb[j]) {
                        dp1[i][j] = max(dp1[i][j], i>0&&j>0?dp1[i - 1][j - 1]+1:1);
                    }
                    dp1[i][j] = max(dp1[i][j], i>0?dp1[i - 1][j]:0);
                    dp1[i][j] = max(dp1[i][j], j > 0 ? dp1[i][j - 1] : 0);
                }
            }
            for (int i = la-1; i >= 0; i--) {
                for (int j = lb - 1; j >= 0; j--) {
                    if (sa[i] == sb[j]) {
                        dp2[i][j] = max(dp2[i][j], dp2[i + 1][j + 1] + 1);
                    }
                    dp2[i][j] = max(dp2[i][j], dp2[i + 1][j]);
                    dp2[i][j] = max(dp2[i][j], dp2[i][j + 1]);
                }
            }
            int ans = 0;
            for (int i = 0; i < la - 1; i++) {
                for (int j = 0; j < lb - 1; j++) {
                    if (pa[i] != -1 && pb[j] != -1) {
    
                        int lef = i > 0 && j > 0 ? dp1[i - 1][j - 1] : 0;
                        int rig = pa[i] < la - 1 && pb[j] < lb - 1 ? dp2[pa[i] + 1][pb[j] + 1] : 0;
                        ans = max(ans, lef + lc + rig);
                    }
                }
            }
            printf("Case #%d: %d
    ",++kase, ans);
        }
        return 0;
    }
  • 相关阅读:
    u
    华为OJ:数字颠倒
    Unity3D &amp; C# 设计模式--23
    Cocos2d-x学习笔记(12)(CCControlSwitch开关、CCControlSlider滑动条、CCControlButtonbutton)
    hdu5299 Circles Game
    asp.net webform中使用async,await实现异步操作
    Restful风格wcf调用4——权限认证
    Restful风格wcf调用3——Stream
    Restful风格wcf调用2——增删改查
    Restful风格wcf调用
  • 原文地址:https://www.cnblogs.com/fenice/p/5543258.html
Copyright © 2011-2022 走看看