标签:
给定字符串,求它的回文子序列个数。回文子序列反转字符顺序后仍然与原序列相同。例如字符串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
#include<iostream>
#include<string>
#include <vector>
const int MOD = 100007;
using namespace std;
int getDifferentsSubStr(string str)
{
if(str.size()==0)
return 0;
int len = str.size();
if(len==1)
return 1;
if(len==2)
{
if(str[0]==str[1])
return 3;
else
return 2;
}
int dp[1000]={0};
dp[0]=1;
dp[1]= (str[0]==str[1])? 3 : 2;
for(int i=2; i<len; i++)
{
dp[i]=(dp[i-1]+1)%MOD;
for(int j=0; j<i; j++)
{
if(str[j]==str[i])
{
dp[i]=(dp[i]+1+getDifferentsSubStr(str.substr(j+1, i-j-1)))%MOD;
}
}
}
return dp[len-1];
}
int main()
{
string str;
int strnum;
vector<int> res;
cin>>strnum;
while(strnum--)
{
cin>>str;
res.push_back(getDifferentsSubStr(str));
}
for(int i=0; i<res.size(); i++)
cout<<"Case #"<<i+1<<": "<<res[i]<<endl;
return 0;
}
标签:
原文地址:http://www.cnblogs.com/aituming/p/4441433.html