其他分享
首页 > 其他分享> > j金字塔

j金字塔

作者:互联网

给定dfs序列 求有多少中可能的树形结构

保证不重复: 我们只枚举第一个子树的情况

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
const int N=305;
const int mod=1e9;
using namespace std;
int read()
{
	int x=0,f=0,c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return f?-x:x;
}
char s[N];
int f[N][N]; 
int n;

int main()
{
	scanf("%s",s+1); n=strlen(s+1);
	for(int i=1;i<=n;i++) f[i][i]=1;
	for(int len=2;len<=n;len++)
		for(int l=1;l+len-1<=n;l++)
		{
			int r=l+len-1;
			if(s[l]==s[r])
			{
				f[l][r]=((ll)f[l][r]+f[l+1][r-1])%mod;
					for(int k=l+2;k<=r-2;k++)
						if(s[l]==s[k])
							f[l][r]=((ll)f[l+1][k-1]*f[k][r]+f[l][r])%mod;
			}
				
		}
	printf("%d",f[1][n]);

	return 0;
}

标签:金字塔,const,int,long,while,include,getchar
来源: https://www.cnblogs.com/juruoHBr/p/15894528.html