【dp】区间计数dp 金字塔

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42725189/article/details/102694512
  • 题目大意:给定一棵树的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]);
}

猜你喜欢

转载自blog.csdn.net/qq_42725189/article/details/102694512