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

回文字符序列

时间:2015-04-20 09:30:35      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
给定字符串,求它的回文子序列个数。回文子序列反转字符顺序后仍然与原序列相同。例如字符串aba中,回文子序列为”a”, “a”, “aa”, “b”, “aba”,共5个。内容相同位置不同的子序列算不同的子序列。

输入
第一行一个整数T,表示数据组数。之后是T组数据,每组数据为一行字符串。

输出
对于每组数据输出一行,格式为”Case #X: Y”,X代表数据编号(从1开始),Y为答案。答案对100007取模。

数据范围
1 ≤ T ≤ 30

小数据

字符串长度 ≤ 25

大数据

字符串长度 ≤ 1000

样例输入
5
aba
abcbaddabcba
12111112351121
ccccccc
fdadfa
样例输出
Case #1: 5
Case #2: 277
Case #3: 1333
Case #4: 127
Case #5: 17
中心思想是dp[i+1][j+1]=dp[i+1][j]+dp[i][j+1]-dp[i][j];

import java.util.Scanner;

public class Palindrome_Sub_Sequence {

    public static void main(String[] args) {
        int dp[][] = new int[1005][1005];
        final int MOD = 100007;
        int count=1;
        int q=1;
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        while (n--!= 0) {
            if (q==1) {
                in.nextLine();
                q++;
            }
            String A = in.nextLine();
            char a[] = A.toCharArray();
            int m = A.length();
            int i,j;
            //System.out.println(n);
            for ( i = 0; i < m; i++) {
                dp[i][i] = 1;
            }
            for ( i = 1; i < m; i++) {
                for ( j = i - 1; j >= 0; j--) {
                    dp[j][i] = (dp[j + 1][i] + dp[j][i - 1] - dp[j + 1][i - 1] + MOD)
                            % MOD;
                    if ((a[i] - ‘0‘) == (a[j] - ‘0‘))
                        dp[j][i] = (dp[j][i] + dp[j + 1][i - 1] + 1 + MOD)
                                % MOD;
                }
            }
            //System.out.println("Case #%d: "+dp[0][n-1]);
            System.out.printf("Case #%d: %d\n", count++, dp[0][m-1]);
        }
        in.close();
    }
}

回文字符序列

标签:

原文地址:http://blog.csdn.net/a819721810/article/details/45137327

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