DP 专练
A - 跳蚤电话
观察性质,可以发现每次连边的点一定是有祖先关系的,可以直接挂上去一个,也可以是在中间边上插入一个点。
所以我很自然的想到去计算树上的点的加入顺序,因为一但加入顺序确定,每一次的操作也就随之确定。
这东西有点类似于拓扑序计数,只不过是有一些限制。
对于一颗子树来说,我们可以发现如果root排在了第一个位置,那么对于所有儿子对应的子树就可以随便排列,也就是一个可重集排列。
另一种情况如果root不在第一个位置,那么root前面的点一定来自于同一个儿子对应的子树,root后面又是一个可重集排列。
根据以上性质我们可以考虑DP,设 \(dp_{x,i}\)为考虑x子树,x节点第i个加入所对应的方案数,\(sum_x\) 表示当前x子树并上来了多少节点,\(all_x=\sum_{i=1}^{siz_x}dp_{x,i}\)。
\(dp_{x,i}=(dp'_{x,i} \times C_{sum-i+siz_v}^{siz_v}+(i!=1)\times dp'_{x,1}\times C_{sum-i+siz_v}^{siz_v-i+1})\times all_v\)
这样得到一个复杂度上界为 \(O(n^2)\) 的做法。
观察发现,dp的实质就是考虑根的位置还有根前面的点来自于谁,于是直接枚举就行,没有必要dp。一个点会被所有的祖先枚举到,但是上界依然是\(O(n^2)\)。
不过对于大树比较浅的情况就可以通过了,期望得分 71pts。
我们尝试优化,但是上面做法的本质就是在枚举根的位置,这一步我暂时无法省略,所以无法通过本题。
换一个思路,加入行不通,我们考虑删除。
发现计算方案数并不好算,因为每并上一棵子树都需要去乘上组合数。考虑计算概率,这样的好处是对于每一棵子树概率独立,最后乘上总方案数即可。
设 \(f_x\) 为删完x子树,得到的排列是合法排列的概率。
一个朴素的做法是枚举最后一个删除的是谁。
\(f_x=\frac{1}{siz_x}\times (\prod_{v\in son_x}f_v+\sum_{v\in son_x}\frac{siz[v]}{siz[x]}f_v\times \prod_{k\in son_x \ and\ k!=v}f_k)\)
这样计算复杂度为\(O(nlogn)\)。期望得分 100pts。
把式子拆开,可以得到一个 \(O(n)\)的算法,但是拓展意义不大,所以就不多说了。
B - 密码锁
这个我只会暴搜啦。没什么好说的。
首先这个图是个竞赛图,缩点以后是条链,我们需要计算强联通分量的个数,实际上可以转化为计算割集的个数。所谓割集就是对于一个集合S,集合内部和外部的连边都是指向外边的。
暴搜计算可以得到 49pts。
根据期望的线性性,我们可以单独算出每个集合对应的概率,然后加起来就是期望。
看到大部分边权都是0.5,只有小部分是特殊的。于是我们可以分集合大小计算期望,只计算特殊边,剩下的最后乘上去即可。
考虑到特殊边的边数是不一定的,所以我们给每个特殊边的贡献乘上2,最后乘0.5,这样特殊边的边数就没有影响了。
一个朴素的思路是枚举哪些边有贡献,显然这些边的两端不在一个集合,其余没贡献的特殊边的两端在同一个集合。
这样就可以进行黑白染色,然后缩成很多个联通块,最后做一遍背包往集合里面加点就行。
复杂度 \(O(2^m\times n^2)\)。这个复杂度有点高,平颈在于背包。
观察到我们实际上是在把联通块当成物品来做背包,那么可以分开计算每个联通块的贡献。
具体的,枚举每个联通块中在割集中的是那些点,然后加上贡献。
最后对于每一个联通块,分贡献点数的多少往上做背包即可。
因为只有m条边,所以同一个联通块最多有m+1个点。复杂度 \(O(2^{m+1}+n^2)\)。期望得分 100pts。
DP 专练的更多相关文章
- 10-19 dp专练
dp专练,终于克服了一次自己对dp的恐惧,磕出来一道题. 得分情况: T1:0 T2:0 T3:0 emmmm,磕出来的题是T2,但是因为初始化和int long long的原因爆零了 T1:n只狼排 ...
- dp专练
dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...
- 记502 dp专练
趁着503的清早 我还算清醒把昨天老师讲的内容总结一下,昨天有点迷了 至使我A的几道题都迷迷糊糊的.(可能是我太菜了) 这道题显然是 数字三角形的变形 好没有经过认真思考然后直接暴力了 这是很不应该的 ...
- P1251 递推专练3
递推专练3 描述 Description 圆周上有N个点.连接任意多条(可能是0条)不相交的弦(共用端点也算相交)共有多少种方案? 输入格式 Input Format 读入一个数N.<=N< ...
- [大山中学dp常练-4 Rounds]
Round#1 2016.9.28 这次晚练十分sb 有点浪费时间 全是dp题 先说过程 3分钟草了第一题之后感觉好像有点水 然后翻了翻题目 看了看第一第四题两颗星 其他三颗星 然后一下子第二题题目太 ...
- 数位dp小练
最近刷题的同时还得填填坑,说来你们也不信,我还不会数位dp. 照例推几篇博客: 数位DP讲解 数位dp 的简单入门 这两篇博客讲的都很好,不过代码推荐记搜的形式,不仅易于理解,还短. 数位dp的式子一 ...
- 2016.4.9 NOI codevs动态规划专练
1.NOI 最大子矩阵 1:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...
- 2016.4.3 动态规划NOI专练 王老师讲课整理
1.6049:买书 总时间限制: 1000ms 内存限制: 65536kB 描述 小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元. 问小明有多少种买书方案?(每种书可购买 ...
- 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534
[树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...
随机推荐
- STC8A,STC8G,STC8H系列的IRC内部振荡源频率调节
从STC15开始, 宏晶就在内置RC震荡源(内置时脉, 宏晶称之为IRC)这条路上越走越远. STC15这一代仅仅是"有", 精度和漂移差强人意. 从STC8开始对IRC的调节就越 ...
- 求最大公因数和最小公倍数(C++实现)
求两个正整数之最大公因子的算法(辗转相除法) 最大公约数是指能同时整除它们的最大正整数 基本原理:两个数的最大公约数等于它们中较小的数和两数之差的最大公约数. 就如有 a = 122, b = 54 ...
- request参数获取,参数校验,参数处理
需求: 1.post接口,需要在过滤器中进行参数校验,校验通过之后再执行方法 2.原有代码中使用x-www-form-urlencoded传参,新需求要使用json格式 3.原有代码校验过滤器使用Se ...
- [算法笔记-题解]问题 C: 例题4-3 比较交换3个实数值,并按序输出
问题 C: 例题4-3 比较交换3个实数值,并按序输出 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 12 MB 题目描述 从键盘输入3个实数a, b, c,通过比较交换, ...
- 比例阀驱动电路后级PWM滤波尖刺如何消除?PWM通过RC低通滤波器模拟DAC
双头比例阀驱动电路,采用单片机输出2路PWM,分别驱动功率器件(U100的2和4脚),经过U100的8和10脚输出供电电源的高压PWM波形,这个高压PWM经过R104和R114分别采样后经过电流放大器 ...
- Ubuntu安装Rocksdb并调试
前言 第一次写博客^_^ 系统是全新的Ubuntu20.04,什么都没有,一切从头开始安装 查看gcc和g++版本 sudo apt-get update gcc --version g++ --ve ...
- pytest 一个测试类怎样使用多种fixture前置方法
fixture()方法写在哪里? @pytest.fixture(scope="范围")写在conftest文件中,如下图 怎么使用fixture()呢?分为一个类中使用一个前置或 ...
- js_给元素增加或移除style属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux系统安装python3和pip
一.安装python 1.安装依赖环境 yum install gcc -y yum -y install zlib-devel bzip2-devel openssl-devel ncurses-d ...
- phar反序列化
我们一般利用反序列漏洞,一般都是借助unserialize()函数,不过随着人们安全的意识的提高这种漏洞利用越来越来难了,但是在今年8月份的Blackhat2018大会上,来自Secarma的安全研究 ...