[***]HZOJ 超级树

DeepinC超详细题解

考试时想出是dp了,因为显然第i级超级树和第i+1级超级树是有联系的(然而我并不能推出来),这dp的状态鬼才想的出来……个人理解,dp的实质就是从小的状态向大的状态转移,从而得到最终答案,状态分的越细,转移起来就越容易理解,同时相应的时间和空间复杂度也会变大。dp数组的设置就相当于分配状态,那么一开始为什么不把它分的细一点呢?最后在考虑优化。

回到这个题,设f[i][j]为第i级超级树,其中有j条路径且这些路径没有相同的点的方案数(有点难以理解,但这样是为了保证没有重复过某点),边界f[1][1]=f[1][0]=1;

这题主要的难点就是状态的设置,然后就是转移有点多,很容易忘掉其中几个,想明白后其他的就比较简单了。

考虑dp[i]对dp[i+1]的
贡献:枚举左子树和右子树的路径条数l、r,记num=dp[i][l]*dp[i][r],则有
• 什么也不做 dp[i+1][l+r]+=num
• 根自己作为一条新路径 dp[i+1][l+r+1]+=num
• 根连接到左子树(或右子树)的某条路径上 dp[i+1][l+r]+=2*num*(l+r)
• 根连接左子树和右子树的各一条路径 dp[i+1][l+r-1]+=2*num*l*r
• 根连接左子树(或右子树)的两条路径 dp[i+1][l+r-1]+=num*(l*(l-1)+r*(r-1))

最后答案即为f[n][1],n级超级树,有1条路径的方案数,实际上就是有几条路径。

然后还有两个坑点:

1.如果$n^3$枚举会T,我不知道知道为啥,所以要考虑优化,DeepinC给了三条优化方案,这里只选去一条:能给f[i][j]贡献答案的,是f[i-1][?],问号如果是大于i+1,显然就没用了。即两维之和不超过n+i所以为了求出f[n][1],那么两维之和就不必超过n+1。所以对j的限制就是0~(n-i+2)那么对k的限制就更紧了,0~(n-i+2-j)。

2.试试这个点 1 1。如果最后输出时不取模的话会输出1,然后就WA了。还是要注意细节啊。

 1 #include<iostream>
 2 #include<cstdio>
 3 #define LL long long
 4 using namespace std;
 5 LL n,mod;
 6 LL f[310][400];
 7 signed main()
 8 {
 9     cin>>n>>mod;
10     f[1][0]=f[1][1]=1;
11     for(int i=1;i<n;i++)
12     {
13         for(int j=0;j<=n-i+2;j++)
14         {
15             for(int k=0;k<=n-i-j+2;k++)
16             {
17                 LL num=f[i][j]*f[i][k]%mod;
18                 f[i+1][k+j]     =( f[i+1][k+j]   +num         )%mod;
19                 f[i+1][k+j]  =( f[i+1][k+j]   +2*num*(j+k) )%mod;
20                 f[i+1][k+j+1]=( f[i+1][k+j+1] +num         )%mod;
21                 f[i+1][k+j-1]=( f[i+1][k+j-1] +2*num*j*k   )%mod;
22                 f[i+1][k+j-1]=( f[i+1][k+j-1] +num*j*(j-1) )%mod;
23                 f[i+1][k+j-1]=( f[i+1][k+j-1] +num*k*(k-1) )%mod;
24             }
25         }    
26     }
27     printf("%lld\n",f[n][1]%mod);
28 }
View Code

 

转载于:https://www.cnblogs.com/Al-Ca/p/11209328.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Win32.pas API函数的简单调用,如建立进程,建立文件映射,建立、读取管道(可以捕捉DOS程序输出)等。 StrFuncs.pas 字符串处理单元,完全兼容宽字节处理(即使用wideString),特有的中文字符串处理函数(如简繁转换等等),经过多次优化,大多以编表的方式进行处理(一般来说是最快的处理方式)。 BiosHelp.pas  读取Bios信息的单元,兼容各种windows系统。 Streams.pas  流(TStream)输入输出处理单元,可以用来保存读取控件属性。 ShlFile.pas  各种文件操作,包括获得系统特殊路径,获取文件图标等。 RegExpr.pas  一个规则表达式类的单元。 ShareMemRep.pas  一个可以用来替代Delphi本身的内存管理的单元。 MessageDlg.pas 提供了一个高制定性的消息对话框。 Lists.pas  提供了很多个TList的扩展类,是学习很研究TList的好东西。 Calendar.pas  公历与农历换算和时间处理的函数单元,具体看里面的说明。 Clipboards.pas 提供一个剪贴板增强类,可支持保存和载入剪贴板,支持多重剪贴板。 ComputerInfo.pas 完整的系统信息检测单元,从软件到硬件,从CPU到鼠标,很全面。 AccessCtrls.pas 一个Access数据库操作单元。 FastIniFile.pas  可以用来替换DELPHI提供的慢吞吞的IniFiles单元,并且支持更多写入读出类型。 EnumStuff.pas 一个募举进程和窗口列表的单元,兼容各种Windows系统。 DES.pas  DES加密算法单元。 AES.pas  AES加密算法单元。 CryptoAPI.pas  一个完整的Hash算法单元,如MD5、CRC之类等等。 FastMM.pas  国外很著名的内存管理单元,Delphi2006的内存管理单元用的就是它。 FastStrings.pas  一个快速字符串处理单元,一些函数用汇编写的,处理速度比DELPHI本身的字符串处理快很多,不过不支持WideString类型。 Idpacker.pas  压缩文件类型检测单元。 ZLibEx.pas  纯Pascal代码的快速压缩解压单元,压缩率和速度都不错。 FastStringFuncs.pas  基于FastStrings.pas单元的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值