题解:UVA1362 Exploring Pyramids
双倍经验:P10956。
Solution UVA1362
Problem
给定一棵树的 dfs 遍历顺序,求其可能对应的树的个数。
Idea
不难发现每一次我们到达一个点,都会立即开始遍历它的子树,经过若干次遍历再回到这个点,然后进行遍历它的下一个子树(如果没有子树了就返回父亲)。
因此,一个树的 dfs 遍历序列一定形如
还不理解?看图:
我们从点
先遍历到
然后遍历到
然后回到
然后依次遍历
然后遍历子树
因此,我们发现一个数
我们发现每个子树都是相互独立的,即一个子树的统计结果不会影响没有包含关系的另一个子树的统计结果。
这个信息显然是可合并的,所以可以区间
设
则显然有:
解释一下就是枚举断点,使得
答案就是
Code
#include<bits/stdc++.h>
using namespace std;
const int N=305,mod=1000000000;
string s;
int n;
long long dp[N][N];
int main(){
while(cin>>s){
n=s.length();
s=' '+s;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)dp[i][i]=1ll;
for(int len=2;len<=n;len++){
for(int i=1,j=len;j<=n;j++,i++){
if(s[i]!=s[j])continue;
for(int k=i;k<j;k++){
if(s[k]!=s[i])continue;
dp[i][j]=dp[i][j]+dp[i][k]*dp[k+1][j-1]%mod;
dp[i][j]%=mod;
}
}
}
printf("%lld\n",dp[1][n]);
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战