#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=300+10;
const int MOD=1000000000;
typedef long long LL;
char S[maxn];
int d[maxn][maxn];
int dp(int i,int j){
if(i==j) return 1;
if(S[i]!=S[j]) return 0;
int& ans=d[i][j];
if(ans>=0) return ans;
ans=0;
for(int k=i+2;k<=j;k++)if(S[k]==S[i]){
ans=(ans+(LL)dp(i+1,k-1)*(LL)dp(k,j))%MOD;//LL保证不会溢出 !!!!
}
return ans;
}
int main(){
while(cin>>S){
memset(d,-1,sizeof(d));
cout<<dp(0,strlen(S)-1)<<endl;
}
return 0;
}
题目求结果除以10^9的余数
如果直接用
ans=(ans+dp(i+1,k-1)*dp(k,j))%MOD;计算
表达式里面的ans+dp(i+1,k-1)*dp(k,j)可能溢出,导致错误,故强制转换为足够大的LL类型