题目链接:https://vjudge.net/problem/UVA-1362
题解:
区间dp
f[ i ][ j ]表示字符串中从 i 到 j 可以构成子树的个数
为了计数不重复,只考虑第一棵子树的位置,枚举划分点k
盗用sdfzyhx的公式
初始化:f[ i ][ i ] = 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int mod=1e9;
LL f[350][350];
char s[350];
int main()
{int len;while(~scanf("%s",s+1)){len=strlen(s+1);memset(f,0,sizeof(f));for(int i=1;i<=len;i++) f[i][i]=1;for(int i=2;i<=len;i++)for(int l=1,r;(r=l+i-1)<=len;l++)if(s[l]==s[r])for(int k=l+2;k<=r;k++)if(s[k]==s[l])(f[l][r]+=(f[l+1][k-1]*f[k][r])%mod)%=mod;printf("%lld\n",f[1][len]);}return 0;
}