noip模拟19/20
这两场考试大部分的题都考过,然鹅有的 \(trick\) 忘了,有的当时咕了(虽然现在还咕着)
首先是 \(v\) 这道题需要加一个小优化,对于较小的状态应该直接用数组记录,较大的再用 map 记
然后就是这个神奇的 \(dp\) 题:
A. 玩具
考场上只会暴搜,胡了一个 hash 还给挂了
正解是神奇的 \(dp\)
首先核心是 \(f[i][j]\) 表示 \(i\) 个点的树深度为 \(j\) 的概率,那么期望即概率乘深度之和
考虑这个怎么转移:
如果想办法从 \(f[i-1][k]\) 转移,可以发现这个状态是不完备的,因为不知道 \(i-1\) 个点深度为 \(k\) 时各个深度的点各有多少个,那么加在每个深度的概率是不相同的
那么考虑这棵树最后加入的点是树顶那个点
因为树顶那个点加入前整个的深度是固定的为 \(j-1\)
那么问题又来了,如果加入的是树顶,那么原来所有的子树将形成一个森林,显然还需要一个变量维护森林的状态
那么设 \(g[i][j]\) 表示 \(i\) 个点的森林深度为 \(j\) 的概率,那么有
接着考虑 \(g\) 的转移,可以想到从一部点形成的树外加另外的点形成森林来转移
假设树的大小为 \(k\),那么一部分是 \(f[i][k]\),发现另一部分的深度是不确定的,只要小于等于 \(j\) 即可
说明状态设计的有问题,那么设计成深度小于等于 \(j\) 就好了
\(f\) 的转移还是一样的
然后再看 \(g\) 的转移,发现还是有 \(bug\),因为总共有 \(j\) 个点,有 \(k\) 个点在第一棵树里,这是有概率的,那么继续打补丁——设 \(dp[i][j]\) 表示 \(i\) 个点的森林有 \(j\) 个点在第一棵树的概率
考虑转移,从 \(dp[i-1][]\) 转移而来,分为新加的点在不在第一棵树里两种情况,方程式为:
这里需要注意看似上一种情况共可以向 \(i-1\) 个点连边,为什么分母上是 \(i\) 呢?
因为漏掉了一种情况就是新加的这个点其实是可以自成一棵树的,所以没有问题
这回终于可以转移 \(g\) 了:
最后是统计答案,由于状态设计的是前缀和形式,那么答案需要减一下,即:
原文地址:https://www.cnblogs.com/yang-cx/p/15033408.html
- 剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)
- Python基础03 序列
- Python基础02 基本数据类型
- 用命令重启IIS 常重启IIS的朋友看过来
- Python基础01 Hello World!
- 剑指OFFER之从上往下打印二叉树(九度OJ1523)
- 给你的博客加上“Fork me on Github”彩带
- Android Studio添加PNG图片报错原因
- 剑指OFFER之包含min函数的栈(九度OJ1522)
- 使用VS2010开发Qt程序的一点经验
- 用Qt写软件系列五:一个安全防护软件的制作(3)
- 剑指OFFER之顺时针打印矩阵(九度OJ1391)
- 用Qt写软件系列五:一个安全防护软件的制作(2)
- 2018年值得关注的200场机器学习会议
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java常用API(Math类)
- Static关键字的使用
- tomcat 并发优化
- Java File类基础解析 使用递归来遍历目录 2
- Java Lambda表达式
- 介绍一款 API 敏捷开发工具
- XSS(跨站脚本攻击)简单讲解
- Java中多线程的使用(超级超级详细)线程池 7
- Python 将土味情话语录设置为桌面壁纸
- Java中多线程的使用(超级超级详细)线程安全原理解析 4
- Java中多线程的使用(超级超级详细) Thead类的使用 3
- Java Properties集合基础解析
- File 类基础解析3 文件过滤器优化
- 原创 | 我在git merge的时候遇到了冲突,怎么解决?
- protobuffer的前世今生(一)——简介