给定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; }