HDU 4632 Palindrome subsequence(区间DP)

Palindrome subsequence

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>

using namespace std;
const int maxn = 1000+5;
const int mod = 10007;
long long dp[maxn][maxn];
char str[maxn];

int main() {
    freopen("data.in", "r", stdin);
    int t, cas;
    scanf("%d", &t);
    for(int cas = 1; cas <= t; ++cas) {
        scanf("%s", &str);
        memset(dp, 0, sizeof(dp));
        int n = strlen(str);

        for(int i = 0; i < n; ++i)
            dp[i][i] = 1;
        for(int i = 0; i < n-1; ++i)
            dp[i][i+1] = (str[i] == str[i+1] ? 3 : 2);

        for(int l = 3; l <= n; ++l) {
            for(int i = 0; i <= n-l; ++i) {
                int j = i + l - 1;

                dp[i][j] = (dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1] + mod)%mod;
                if(str[i] == str[j]) {
            //如果区间两头是相等的,则要加上dp[i+1][j-1]+1,
            //因为首尾是可以组成一个回文子串的,而且首尾可以与中间任何一个回文子串组成新的回文子串
                    dp[i][j] = (dp[i][j]+ dp[i+1][j-1]+1)%mod;
                }
            }
        }

        printf("Case %d: %d\n", cas, dp[0][n-1]);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/ccshijtgc/article/details/81025635