• HDU4681 String(dp)


    题目链接

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <string>
    
    using namespace std;
    
    const int maxn = 1000+10;
    
    char s1[maxn], s2[maxn], s3[maxn];
    int dp1[maxn][maxn], dp2[maxn][maxn];
    int que1[maxn][2], que2[maxn][2];
    
    void max_dp(char *s1, char *s2, int (*dp)[maxn]) {
        int len1 = strlen(s1), len2 = strlen(s2);
    
        for(int i=0; i<len1; i++) dp[i][0] = 0;
        for(int i=0; i<len2; i++) dp[0][i] = 0;
    
        for(int i=1; i<=len1; i++) {
            for(int j=0; j<=len2; j++) {
                if(s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1]+1;
                else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            }
        }
    }
    
    void str_rev(char *s) {
        int len = strlen(s);
        for(int i=0; i<len/2; i++) swap(s[i], s[len-1-i]);
    }
    
    int get_str(char *s1, char *s2, int (*que)[2]) {
        int len1 = strlen(s1), len2 = strlen(s2);
        int n = 0;
    
        for(int i=0; i<len1; i++) {
            if(s1[i] == s2[0]) {
                int k = 1, j;
                for(j=i+1; j<len1; j++) {
                    if(s1[j] == s2[k]) k++;
                    if(k == len2) break;
                }
                if(k == len2) {
                    que[n][0] = i;
                    que[n++][1] = j;
                }
            }
        }
    
        return n;
    }
    
    int main() {
        int T;
    
        scanf("%d", &T);
        for(int kase=1; kase<=T; kase++) {
            scanf("%s %s %s", s1, s2, s3);
    
            int len1 = strlen(s1);
            int len2 = strlen(s2);
            int len3 = strlen(s3);
    
            int n1 = get_str(s1, s3, que1);
            int n2 = get_str(s2, s3, que2);
    
            max_dp(s1, s2, dp1);
    
            str_rev(s1);
            str_rev(s2);
    
            max_dp(s1, s2, dp2);
    
            int ans = 0;
            for(int i=0; i<n1; i++) {
                for(int j=0; j<n2; j++) {
                    ans = max(ans, dp1[que1[i][0]][que2[j][0]]+dp2[len1-que1[i][1]-1][len2-que2[j][1]-1]+len3);
                }
            }
    
            printf("Case #%d: ", kase);
            printf("%d
    ", ans);
        }
    
        return 0;
    }
  • 相关阅读:
    怎么修改android飞行模式wifi
    斐讯n1盒子装远程迅雷
    Spring使用大全
    面向对象7大设计原则
    Mybatis之SqlNode解析
    【转载】MongoDB的C#驱动程序教程
    【转载】 mongodb C# 基本类库
    【转载】列举MongoDB C#驱动的几个Query方法
    【转载】MongoDB开发学习
    【转载】sql全国省市区数据库建表过程
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3268263.html
Copyright © 2020-2023  润新知