码迷,mamicode.com
首页 > 其他好文 > 详细

hihoCoder #1149 Palindrome

时间:2015-08-19 00:16:52      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

Description

Given a string, calculate the number of subsequences that are palindrome. A palindrome is a sequence of characters that reads the same backward or forward. For example, in the string “aba”, there are 7 subsequences "a", "b", "a", "ab", "aa", "ba", "aba". Only "a", "b", "a", "aa", "aba" are palindrome. Two subsequences that contain characters from different positions are considered different.

Input

The first line of input contains a single integer T specifying the number of test cases.  In each test case, there is only one line containing a string.

Output

For each test case, output a line containing "Case #X: Y", where X is the test case number starting from 1, followed by one integer Y indicating the number of palindrome subsequences. Output the answer modulo 100007.

Limits

1 ≤ T ≤ 30

Small

Length of string ≤ 25

Large

Length of string ≤ 1000

 

Sample Input

5
aba
abcbaddabcba
12111112351121
ccccccc
fdadfa

Sample Output

Case #1: 5
Case #2: 277
Case #3: 1333
Case #4: 127
Case #5: 17

Solution:


典型的动态规划问题, TALK IS CHEAP......

 1 #include <iostream>
 2 #include <vector>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 typedef long long LL;
 7 const LL MOD = 100007;
 8 
 9 
10 LL palindromeSeq(char *s, int i, int j, vector<vector<LL> > &dp) {
11     if ( i > j) return 0;
12     if (i == j) return 1;
13     if (dp[i][j] >= 0) return dp[i][j];
14     if (s[i] == s[j]) {
15         dp[i][j] = 1 + (palindromeSeq(s, i+1, j, dp)%MOD) + (palindromeSeq(s, i, j-1, dp)%MOD);
16     
17     }
18     else {
19         dp[i][j] = ((- (palindromeSeq(s, i+1, j-1, dp)%MOD) + MOD)%MOD) + 
20                     (palindromeSeq(s, i+1, j, dp)%MOD) + 
21                     (palindromeSeq(s, i, j-1, dp)%MOD);
22     
23     }
24     return dp[i][j] = dp[i][j] %MOD;
25 
26 }
27 
28 int main() {
29     int T;
30     cin >> T;
31     for (int k = 1; k <= T; ++k) {
32         char buf[1010];
33         scanf("%s", buf);
34         int len = strlen(buf);
35         vector<vector<LL> > dp(len, vector<LL>(len, -1));
36         cout << "Case #" << k << ": " << palindromeSeq(buf, 0, len-1, dp) << endl;
37     }
38 
39 }

 

hihoCoder #1149 Palindrome

标签:

原文地址:http://www.cnblogs.com/liew/p/4741026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!