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;
}
原文地址:https://www.cnblogs.com/tanhehe/p/3268263.html