时间限制:
2000ms
单点时限:
1000ms
内存限制:
256MB
-
5 aba abcbaddabcba 12111112351121 ccccccc fdadfa
样例输出
-
Case #1: 5 Case #2: 277 Case #3: 1333 Case #4: 127 Case #5: 17
描述
给定字符串,求它的回文子序列个数。回文子序列反转字符顺序后仍然与原序列相同。例如字符串aba中,回文子序列为"a", "a", "aa", "b", "aba",共5个。内容相同位置不同的子序列算不同的子序列。
输入
第一行一个整数T,表示数据组数。之后是T组数据,每组数据为一行字符串。
输出
对于每组数据输出一行,格式为"Case #X: Y",X代表数据编号(从1开始),Y为答案。答案对100007取模。
数据范围
1 ≤ T ≤ 30
小数据
字符串长度 ≤ 25
大数据
字符串长度 ≤ 1000
分析:
这题可以使用区间动态规划法。
首先考虑怎么样定义dp让它满足具有通过子结构来求解。
用dp(i,j)代表字符串中位置i到位置j之间的回文字符串个数。
找到状态转移方程式:
考虑字符串:a????a 这种情况,i,j分别是头尾两个a,则d(i,j) = d(i+1,j-1)+ 1
对于任意一个字符串,比如abcd,只要知道a+子字符串bcd中的回文和子字符串abc中的回文数+d,bc字符串计算了两遍,所以需要减去一个,则d(i,j)= d(i+1,j)+d(i,j-1)-d(i+1,j-1)
于是就将长字符串,依赖于短字符串中的回文个数。通过上面那两个状态转移方程式。就可以得出最终长字符串的回文个数。