hdu4632 Palindrome subsequence (求区间中回文串数量)

思路:用dp[i][j]表示这一段里有多少个回文串,那首先dp[i][j]=dp[i+1][j]+dp[i][j-1],但是dp[i+1][j]和dp[i][j-1]可能有公共部分,所以要减去dp[i+1][j-1]。
如果str[i]==str[j]的话,还要加上dp[i+1][j-1]+1。

#include  <cstring>
#include <iostream>
#include  <cstdio>
#include  <algorithm>
using namespace std;
int dp[1006][1055];
int t;
char a[1100];
const int mod = 10007;
int main() {
    scanf("%d", &t);
    for(int cas = 1; cas <= t; cas++) {
        memset(dp, 0, sizeof(dp));
        scanf("%s", a + 1);
        int len = strlen(a + 1);
        for(int i = 1; i <= len; i++) {
            dp[i][i] = 1;
            for(int j = i - 1; j >= 1; j--) {
                dp[j][i] = (dp[j][i - 1] + dp[j + 1][i]-dp[j+1][i-1]+mod) % mod;
                if(a[i] == a[j]) {
                    dp[j][i] += dp[j + 1][i - 1] + 1;
                    dp[j][i]%=mod;
                }
            }
        }
        printf("Case %d: %d\n", cas, dp[1][len]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80382955