程序笔记   发布时间:2022-07-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了题解:玩具大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

  概率期望DP,其DP性质发现于随n的递变,问题空间呈规律性变化

通常情况下,期望问题有两种基本解决思路:1.计算出总贡献除以总情况数

2.计算出子问题概率,利用定义,再乘以子问题对应贡献即可

  首先想到思路一,设计f[i][j]表示进行到第i轮,子树最大深度为j的情况数

考虑如何转移,想到的是将第i次操作在叶节点进行,由i-1进行拓展,发现

需要维护当前阶段第j层叶节点数,O(n^3)可行,然而发现每一层节点都由上

一层节点进行转移,时间复杂度O(n^4),(当然,矩阵优化O(n^3*logn)卡常

可做,如果不嫌麻烦),于是当事一直思考如何优化,事实上这是错误的策略

通常情况下我们并不能一下子想到正确DP,此时应考虑更换思路

  事实上思路一还有一种做法,转化为计数DP即可(这也是第一种思路的本质)

考虑给树定形,发现1,2节点的位置相对固定,而树形DP本质问题是子树与

父树的相互关系,在1,2节点固定后,我们并不需要考虑每一种树形态,问题

在于树的期望深度,那么DP过程只需要转移子树深度,大小,分别考虑以1,2

节点为根,乘法计数,即可O(n^4),这种思考方式的有点在于并不去考虑与问题无

关的树形,而是将所有树形化归为一种抽象形态,避免了具体考虑转移的繁杂,

个人认为相较于第一种方法更优

  上述两种方式均以计数DP方式计算总贡献进而推出期望,但是其并不适用与

本问题,本问题更接近与抽象问题,因为在阶段推进过程中,仅仅是生成树,树

的形态不定,也就是没有统一的转移方式,具体思考会陷入陷阱。

  于是我们考虑抽象思考,绕过树形态的变化,采取第二种思路,宏观考虑从

一种形态转化为另一种形态的概率。转移无定式,对于本题更是如此,考虑对于

当前树,他是如何被生成的。因为对于生成方式完全无描述,我们可以认为,第

一种情况是有子树在叶节点拓展生成,另一种情况是由新节点连接若干子树行形成。

  发现第二种情况显然比第一种情况简洁,于是对于i个节点,j深度子树生成概率

就由i-1节点,最大深度等于j-1的森林生成概率转移而来,于是可以并行DP

(很多情况下,当一中DP无法进行时,可以利用多DP并行,记录所需信息来辅助

主DP转移),发现对于森林概率的DP,其最优子结构由子森林与子树构成,也就

是说森林与树生成概率的转移相辅相成,基本完成。

  当然存在一个问题为森林的转移存在概率限制,即另需记录i节点j深度森林中

某棵树为k节点概率,由于这棵树的编号是等效的,故数学归纳得概率为1/i

代码如下:

题解:玩具

题解:玩具

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define I int
 4 const I MAXN = 205;
 5 I n,mod,res;
 6 I f[MAXN][MAXN],g[MAXN][MAXN],d[MAXN];
 7 inline I qpow (I base,I index) {
 8     I res(1);
 9     for ( ; index ;index >>= 1,base = 1ll * base * base % mod)
10       if (index & 1) res = 1ll * res * base % mod;
11     return res;
12 }
13 signed main () {
14     cin >> n >> mod;
15     for (I i(1);i <= n; ++ i) d[i] = qpow (i,mod - 2);
16     for (I i(0);i <= n; ++ i) f[1][i] = g[1][i] = g[0][i] = 1;
17     for (I i(2);i <= n; ++ i)
18       for (I j(0);j <= n; ++ j) {
19         if (j) f[i][j] = g[i - 1][j - 1];
20         for (I k(1);k <= i; ++ k)
21           g[i][j] = (g[i][j] + 1ll * f[k][j] * g[i - k][j] % mod * d[i]) % mod;
22       }
23     for (I i(1);i <= n; ++ i)
24       res = (res + 1ll * (f[n][i] - f[n][i - 1]) * i) % mod;
25     cout << (res + mod) % mod << endl;  
26 }
View Code

 

大佬总结

以上是大佬教程为你收集整理的题解:玩具全部内容,希望文章能够帮你解决题解:玩具所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: