前置知识
解法
DFS 序可近似理解为欧拉序,故考虑区间 DP。
设 \(f_{l,r}\) 表示 \([l,r]\) 对应的二叉树的个数,状态转移方程为 \(f_{l,r}=\begin{cases} 1 & l=r \\ [s_{l}=s_{r}] \times \sum\limits_{i=l+2}^{r}[s_{l}=s_{i}] \times f_{l+1,i-1} \times f_{i,r} & l \ne r\end{cases}\)。
最终,有 \(f_{1,n}\) 即为所求。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
const ll p=1000000000;
ll f[400][400];
char s[400];
int main()
{
ll n,len,l,r,i;
while(cin>>(s+1))
{
n=strlen(s+1);
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
f[i][i]=1;
}
for(len=1;len<=n;len++)
{
for(l=1,r=l+len-1;r<=n;l++,r++)
{
if(s[l]==s[r])
{
for(i=l+2;i<=r;i++)
{
f[l][r]=(f[l][r]+(s[l]==s[i])*f[l+1][i-1]*f[i][r]%p)%p;
}
}
}
}
cout<<f[1][n]<<endl;
}
return 0;
}
标签:UVA1362,题解,ll,400,long,times,Pyramids,define
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18170040