[HIHO1149]回文字符序列(dp)

题目链接:http://hihocoder.com/problemset/problem/1149

题意:中文的。

dp(i,j)表示[i,j]区间内的回文串数量。

如果s[i]!=s[j],dp(i,j)=dp(i+1,j)+dp(i,j-1)-dp(i+1,j-1)

如果s[i]==s[j],dp(i,j)=dp(i+1,j)+dp(i,j-1)+1

注意取模

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 1010;
 5 const int mod = 100007;
 6 int n;
 7 char s[maxn];
 8 int dp[maxn][maxn];
 9 
10 int main() {
11   //freopen("in", "r", stdin);
12   int T, _ = 1;
13   scanf("%d", &T);
14   while(T--) {
15     scanf("%s", s); n = strlen(s);
16     memset(dp, 0, sizeof(dp));
17     for(int i = 0; i < n; i++) dp[i][i] = 1;
18     for(int i = 0; i < n; i++) {
19       for(int j = i-1; j >= 0; j--) {
20         if(s[i] != s[j]) dp[j][i] = dp[j+1][i] + (dp[j][i-1] - dp[j+1][i-1] + mod) % mod;
21         else dp[j][i] = dp[j+1][i] + dp[j][i-1] % mod + 1 % mod;
22       }
23     }
24     printf("Case #%d: %d
", _++, dp[0][n-1] % mod);
25   }
26   return 0;
27 }
原文地址:https://www.cnblogs.com/kirai/p/5921115.html