经典字符串区间dp,注意动态规划方程时按区间长度进行递推。
代码:
<span style="font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[100];
long long dp[100][100];
void solve()
{
int len=strlen(str);
memset(dp,0,sizeof(dp));
for(int i=0;i<len;i++)
dp[i][i]=1;
for(int j=1;j<len;j++)
for(int i=0;i+j<len;i++)
{
if(str[i]==str[i+j])
dp[i][i+j]=dp[i][i+j-1]+dp[i+1][i+j]+1;
else
dp[i][i+j]=dp[i][i+j-1]+dp[i+1][i+j]-dp[i+1][i+j-1];
}
printf("%lld\n",dp[0][len-1]);
}
int main()
{
int t;
gets(str);
sscanf(str,"%d",&t);
while(t--)
{
gets(str);
solve();
}
return 0;
}</span>