zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    C语言-if语句
    C语言-表达式
    C语言-基础
    Java for LeetCode 187 Repeated DNA Sequences
    Java for LeetCode 179 Largest Number
    Java for LeetCode 174 Dungeon Game
    Java for LeetCode 173 Binary Search Tree Iterator
    Java for LeetCode 172 Factorial Trailing Zeroes
    Java for LeetCode 171 Excel Sheet Column Number
    Java for LeetCode 169 Majority Element
  • 原文地址:https://www.cnblogs.com/tanhehe/p/3268263.html
Copyright © 2011-2022 走看看