part 13
- T1
- 可以发现就是求拓扑排序的方案数
- 初始答案为 \(\frac{n!}{size_x}\)
- 考虑有 \(q\) 次删除操作,我们考虑维护当前还剩多少个数 \(m\)
- 假如删除的数为 \(x\),则先计算 \(size_x\) 再向上用 \(map\) 打标记,统计答案即可
- 卡在的点在于不会在 \(O(\sqrt{N})\) 的时间内求解 \(n!\)
- P4360 斜率优化转移DP
- 我们可以发现 伐木场的个数只有两个,故可以考虑直接 dp 转移
- 定义 \(g_i\) 为只有一个伐木场并且建造在 \(i\) 处的 \(1-i\) 的花费总和
- 假设第 \(i\) 棵树重 \(a_i\),第 \(i\) 棵树在 \(X_i\) 的位置上
- 定义 \(f_i\) 为有两个伐木场其中一个是 \(i\),另一个 \(j < i\) 的 \(1-j\) 最小 花费总和
- 我们故可以得到转移方程
- \(f_i = \min(g_j + a_{j+1} \cdot (X_i - X_{j+1}) + a_{j+2} \cdot (X_i - X_{j+2})) + …… + a_{i-1} \cdot (X_i - X_{i-1}) + a_i \cdot (X_i - X_i)\)
- 我们可以将式子展开
- 我们记 \(suma_i = \sum_{j=1}^{i} a_j\),\(dis_i = \sum_{j=1}^{i} a_j \cdot X_j\)
- 则 \(f_i = \min(g_j + (suma_i - suma_{j}) \cdot X_i - (dis_i - dis_{j}))\)
- 展开即可得到 \(suma_{j} \cdot X_i + f_i - suma_i \cdot X_i + dis_i = g_j + dis_{j}\)
- 故我们可以发现 \(X_i\) 单调递增,故可以使用斜率优化转移 DP,\(O(N)\) 解决
- p3628 斜率优化转移DP
- 定义 \(sum_i = \sum_{j=1}^{i} x_i\)
- 定义 \(dp_i\) 表示给 \(1-i\) 都分配了军队后的最大战斗力之和
- 则
- \(dp_i = \max(dp_j + a \cdot (sum_i - sum_j)^2 + b \cdot (sum_i - sum_j) + c)\)
- 即为 \(dp_i = \max(a\cdot (sum_i)^2 + b \cdot sum_i - 2 \cdot a \cdot sum_i \cdot sum_j + a \cdot (sum_j)^2 - b \cdot sum_j + c + dp_j)\)
- 则有 \(2 \cdot a \cdot sum_i \cdot sum_j - c + dp_i - a\cdot (sum_i)^2 - b \cdot sum_i = a \cdot (sum_j)^2 - b \cdot sum_j + dp_j\)
- 则有 \(ax + b = y\) 的形式
- 考虑 \(2a\cdot sum_i\) 单调递减,\(sum_j\) 单调递增
- 又由于是求取最大值故可以考虑维护上凸壳进行求解复杂度为 \(O(N)\)
- P1365 期望DP
- 定义 \(f_i\) 为遍历到 \(i\) 的期望值
- 我们考虑时刻维护 \(len\) 表示 ooo 的连续段的期望值
- 若 \(i\) 为 o 则 \(f_i = f_{i - 1} + 2 \cdot len + 1\),\(len = len + 1\)
- 若 \(i\) 为 x 则 \(f_i = f_{i - 1}\),\(len = 0\)
- 若 \(i\) 为 ? 则 \(f_i = f_{i - 1} + len + 0.5\), \(len = \frac{len+1}{2}\)
- P6280
- 一眼就想到了是由若干环组成的,进行恰好 \(k\) 步可以等价于所有环长的最小公倍数等于 \(k\)
- 然后又一眼想出,如果我们用了一些数它们的和小于 \(n\),那么我们可以用若干个环长为 1 的环来保证它们的最小公倍数不变
- 由于一些数的 lcm 为这些数每个质数的指数的 max 的乘积,故我们可以想到可以使用 \(p_1^{a_1},p_2^{a_2}……p_m^{a_m}\) 使得在和最小的情况下,lcm 最大
- 故我们可以定义 \(f_{i,j}\) 表示到了第 \(i\) 个质数,前面选的环的数的总和为 \(j\) 的乘积总和
- 转移枚举第 \(i\) 个质数的指数,转移即可
- p4161
- p4284 概率DP
- 我们考虑先算以 \(x\) 为根的子树对 \(x\) 的影响
- 定义 \(f_x\) 为 \(x\) 被通电的概率
- 我们令当前遍历到了子节点 \(nx\)
- 令 \(w = f_{nx} \cdot p_{x,nx}\)
- 那么 \(f_x = f_x + w - (f_x \cdot w)\)
- 接下来我们考虑如何将父节点上的信息传递到子节点
- 我们令节点 \(i\) 的答案为 \(dp_i\)
- 首先根节点此时的 \(f_x\) 就是它的答案
- 考虑父亲节点 \(fa\) 如何使用换根技术来计算 \(x\) 的答案
- 首先 \(dp_{fa}\) 要减去 \(f_x\) 上传来的贡献
- 令 \(w = f_x \cdot p_{x,fa}\) 则有 \(dp_{fa} = P_{fa} + w - (P_fa \cdot w)\)
- 则 \(P_{fa} = \frac{dp_{fa}-w}{1-w}\) 须特判 \(w = 1\) 的情况
- 然后按照子节点转移到父节点的方式同样的转移即可
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |