题目链接:UVALIVE 3516
解题思路:
大白书上题目,思路当然是枚举所有情况,实现即记忆化搜索或者动态规划。具体的做法就是枚举根结点最左边的结点,右边的所有结点情况随意,递归调用即可。dp[i][j]表示以S[i]根结点的多叉树的情况数量。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MOD 1000000000
using namespace std;
char st[305];
long long n,dp[305][305];
long long dfs(int i,int j)
{
if(i>j||i+1==j)
return dp[i][j]=0;
if(i==j)
return dp[i][j]=1;
if(dp[i][j]!=-1)
return dp[i][j];
dp[i][j]=0;
for(int k=i+2;k<=j;k++)
{
if(st[i]==st[k])
{
dp[i][j]=(dp[i][j]+dfs(i+1,k-1)*dfs(k,j))%MOD;
}
}
return dp[i][j];
}
int main()
{
while(~scanf("%s",st))
{
n=strlen(st);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dp[i][j]=-1;
dfs(0,n-1);
printf("%lld\n",dp[0][n-1]);
}
return 0;
}