版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
- 题目大意:给定一棵树的dfs序,求有多少树的可能性。
- 思路:由于数据较小,考虑区间dp。设f[i][j]表示i~j的数量。这里注意由于要计数,所以要保证计算的数据不重不漏。可以将一个区间分为第一棵子树和其他子树。 所以f[i][j]+=f[i +1][k] f[k+1][j]。
#include<bits/stdc++.h>
using namespace std;
char fw[305];long long f[305][305],n;
int main()
{
scanf("%s",fw+1);
n=strlen(fw+1);
for(int i=1;i<=n;i++)
{
f[i][i]=1;
}
for(int len=2;len<=n;++len)
{
for(int l=1;l<=n-len+1;++l)
{
int r=l+len-1;
if(fw[l]!=fw[r])continue;
for(int k=l;k<r;++k)
{
f[l][r]=(f[l][r]+f[l+1][k]*f[k+1][r])%1000000000;
}
}
}
printf("%lld",f[1][n]);
}