孩子们,正睿补习计划重启了。
自建题单:ZR 2022 summer B - Virtual Judge
P10447 最短 Hamilton 路径 - 洛谷 | 计算机科学教育新生态
求从 \(1\) 号点出发恰好经过每个点一次并且最终回到 \(1\) 号点的最短路径。
设 \(dp_{i,s}\) 表示恰好经过了集合 \(s\) 中的点一次,当前在 \(i\) 这个点。
转移就是 \(dp_{i,s\cup\{i\}}\leftarrow dp_{j,s}+w_{j,i}(i\not\in s,j\in s)\)。
答案就是 \(\min dp_{k,\{1,2,...,n\}+w_{k,1}}\),时间复杂度 \(O(n\log n)\)。
记录详情 - 洛谷 | 计算机科学教育新生态
Bin Packing - Gym 329414G - Virtual Judge
给 \(n\) 个物品,体积分别为 \(w_i\),求最少要多少个体积为 \(m\) 的袋子能装下,保证 \(w_i\le m\)。
我们设 \(dp_{0/1,S}\) 表示包含集合 \(S\) 内的物品时最小袋子数与此时的最小体积。
那么我们考虑新加入一个物品时最小体积变化情况即可,记得一个物品不可以被拆开,只能一块留在剩余体积中。
时间复杂度 \(O(n2^n)\)。
没权限看题面,去 vj 看提交记录吧。
DFSCount - TopCoder 14588 - Virtual Judge
给一张无向连通图,求 \(dfs\) 序个数。
我们设 \(dp_{i,S}\) 表示从点 \(i\) 出发,在集合 \(S\) 中的 \(dfs\) 序个数。
首先处理出来删去 \(i\) 后有多少个连通块,设有 \(k\) 个连通块集合 \(S_1,S_2,...,S_n\) ,则 \(dp_{i,S}=k!\prod_{i=1}^k\sum_{j\in S_i}dp_{j,S_i}\)。
时间复杂度 \(O(n^22^n)\),这题不能交了。
P6192 【模板】最小斯坦纳树 - 洛谷 | 计算机科学教育新生态
给一张带权无向连通图,求将关键点连通的最小边权和。
首先一定会选出一棵树,我们给这个树随便定一个根,设 \(dp_{i,S}\) 表示以 \(i\) 为根,包含集合 \(S\) 内的关键点,最小代价。
首先可以枚举子集转移 \(dp_{i,S}\leftarrow dp_{i,S1}+dp_{i,S\setminus S1}(S1\subset S)\)。
其次可以做转移 \(dp_{i,S}\leftarrow dp_{i,S}+w_{i,j}\),使用 dij 做最短路即可,注意一定要将所有点值都扔进堆。
时间复杂度 \(O(3^kn+2^km\log m)\)。
记录详情 - 洛谷 | 计算机科学教育新生态
[P3959 NOIP2017 提高组] 宝藏 - 洛谷 | 计算机科学教育新生态
给一个图,求生成树最小代价,一颗生成树的代价为 \(\sum w_{(i,fa_i)}dep_{fa_i}\)。
我们预处理 \(w_{S_1,S_2}\) 表示 \(S_1\) 向 \(S_2\) 连边,要求 \(S_2\) 到 \(S_1\) 构成单射,边权和最小值,可以通过补集子集枚举递推做到。
正常想法是设 \(dp_{S,S_1,d}\) 表示选择集合 \(S\) 的点,最后一层是 \(S_1\),深度为 \(d\)。
转移考虑枚举 \(t\) 为 \(S\) 补集的子集,然后最后一层向它连边,复杂度是 \(O(n4^n)\) 的。
我们考虑不记录最后一层,只要 \(t\) 与 \(S\) 有连边即可。
这样可能算大答案,但是正确答案一定会被统计到。
证明这个可以考虑证明对于最优解的每一层,如果有某个点被它的更高的祖先连边,那么将这个点与那个祖先直接连边更优,且若这个点没有被连到那个祖先,那么一定连到了更优的位置,仍然不符。
这个证明的正确性是由于对于 \(w_{S_1,S_2}\) 中,\(S_2\) 的每个点之间是互不影响的。
时间复杂度 \(O(n3^n)\)。
记录详情 - 洛谷 | 计算机科学教育新生态
[P5369 PKUSC2018] 最大前缀和 - 洛谷 | 计算机科学教育新生态
给一个序列,求它的所有排列的最大前缀和的和。
考虑对于某个排列,设位置 \(p\) 是第一个最大前缀和的位置,则 \(1\sim p-1\) 的后缀和全都 \(>0\),\(p+1\sim n\) 的前缀和全都 \(\le 0\)。
设 \(F_{S}\) 表示集合 \(S\) 后缀和全都 \(>0\) 的排列的个数,\(G_S\) 表示集合 \(S\) 前缀和全都 \(\le 0\) 的排列的个数。
转移考虑处理 \(sum_S\) 表示集合 \(S\) 的权值和,判断总和是否合法,若合法就为所有与其差一位的子集的 \(dp\) 值的和。
答案即为 \(\sum_{S,i\in S}{F_{S\setminus \{i\}}G_{T\setminus S}}\)。
记录详情 - 洛谷 | 计算机科学教育新生态
[P4547 THUWC2017] 随机二分图 - 洛谷 | 计算机科学教育新生态
给一张二分图,每条边在且仅在其中一种约束中:
- 有 \(50\%\) 概率出现。
- 与另一条边捆绑,二者必须同时出现或消失,概率都为 \(50\%\)。
- 与另一条边捆绑,二者必须且只能出现一条,概率都为 \(50\%\)。
求所有图的出现概率乘上它的完美匹配个数之和。
由于期望的线性性,它就等同于求每个完美匹配的出现概率之和,对于每个完美匹配,它不含的边是不用考虑的,它的概率可看作 \(1\)。
首先考虑只有约束 \(1\),设 \(dp_{i,S}\) 表示左部到了第 \(i\) 个点,右部匹配了集合 \(S\) 中的点的完美匹配的概率之和,转移枚举边即可。
考虑约束 \(2,3\),我们设 \(dp_{S_1,S_2}\) 表示左部匹配了 \(S_1\),右部匹配了 \(S_2\) 的完美匹配的概率之和。
考虑枚举每种转移 \((i,j,w)(i\cap S_1=\varnothing,j\cap S_2=\varnothing)\),有转移 \(dp_{S_1\cup i,S_2\cup j}\leftarrow w\times dp_{S_1,S_2}\)。
这里的 \(i,j\) 是集合,方便下面转化,我们认为每条边都在 \(1\) 约束中,构建转移 \((\{a_i\},\{b_i\},\frac 1 2)\),此时我们对于 \(2,3\) 考虑巧妙转化。
对于 \(2\) ,如果只有一条在匹配中,那么另一条是可以不用管的,反正都会被算成 \(\frac 1 2\),两条都不在匹配中的话也不用管它。
如果两条都在匹配中,会被算成 \(\frac 1 4\),新增一个 \((\{a_1,a_2\},\{b_1,b_2\},\frac 1 4)\),由于期望的线性性,我们就会把两边的概率算成 \(\frac 1 4 +\frac 1 4 =\frac 1 2\)。
对于 \(3\) 是同理的,对于两条都出现,我们新增一个 \((\{a_1,a_2\},\{b_1,b_2\},\frac 1 4)\)的转移,这样转移两边概率就会算成 \(\frac 1 4 -\frac 1 4=0\)。
由于 \(dp\) 添加边的顺序不同不能被看做多种方案,我们强制钦定每次只选择 \(i\) 包含左部图第一个没被匹配的点与右部图匹配转移。
复杂度看着是 \(O(m2^n)\) 的,但实际上状态数的左右部图需要相等,是 \(\sum\binom{n}{i}^2=\sum\binom{n}{i}\binom{n}{n-i}=\binom{2n}{n}\) 的,使用记忆化搜索可以通过。
记录详情 - 洛谷 | 计算机科学教育新生态