链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4108
题解
这题的转移十分奇妙
f(i,j)=∑kf(i+1,k−1)×f(k,j)(si=sj=sk)
f
(
i
,
j
)
=
∑
k
f
(
i
+
1
,
k
−
1
)
×
f
(
k
,
j
)
(
s
i
=
s
j
=
s
k
)
下面这张图足以解释这个式子了
代码
//Çø¼ädp
#include <bits/stdc++.h>
#define maxn 310
#define mod 1000000000ll
#define ll long long
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
ll f[maxn][maxn], N;
char s[maxn];
void init()
{
cl(f);
N=strlen(s+1);
}
void dp()
{
ll l, i, j, k;
for(i=1;i<=N;i++)f[i][i]=1;
for(l=2;l<=N;l++)for(i=1;i+l-1<=N;i++)
{
j=i+l-1;
if(s[i]==s[j])for(k=i+2;k<=j;k++)if(s[k]==s[i])f[i][j]=(f[i][j]+f[i+1][k-1]*f[k][j])%mod;
}
printf("%lld\n",f[1][N]);
}
int main()
{
while(~scanf("%s",s+1))init(), dp();
return 0;
}