加载中...

ABC 404 FG

F

概率 \(dp\) + 组合数枚举trick + 复杂度分析

\(dp[i][j]:\) 进行了 \(i\) 轮,至少按了 \(j\) 次正确按钮的概率。

\(ans = dp[T][K]\)

\(init: dp[0][0] = 1\)

\(trans:\) 决策第 \(i\) 轮按下按钮的所有情况:

设在第 \(i\) 轮中,按下第 \(j\) 个按钮 \(c_{j}\) 下。

则有:\(c_{1} + c_{2} + ... + c_{n} = M\)

对于第 \(i\) 轮的所有情况,一定取的是最优解,因此转移得到的概率应当取所有情况的最大值。因此转移式为:

\[dp[i][j] = max_{c_{1} + c_{2} + ... + c_{n} = M}(\sum_{k=1}^{n}dp[i - 1][max(0, j - c_{k})]) \]

注意上述取max部分的处理:\(dp\) 数组的定义是"至少"而不是"恰好",因此按钮按多时,仍取之前按下 \(0\) 次的概率。

因此问题转化为了枚举 \(c_{1} + c_{2} + ... + c_{n} = M\) 的所有可能性。

注意到 \(n\) 很大,但 \(M <= 30\) 很小。可以只枚举 \(c_{i} > 0\) 的所有 \(c_{i}\)(不会超过 \(M\) 个),那么剩下的 \(c_{i}\) 就均为 \(0\)。又能注意到,\(c_{i}\) 的枚举顺序是不会影响结果的,且计算的是最大值而不是总和,因此对于一个固定的集合,没有必要枚举它的全部排列,只需要枚举一个即可。因此可以通过升序枚举排列的方式来达到上述要求。复杂度大概是 \(O(M^{3})\)(暂时还不是很懂,以后补)。总复杂度 \(O(TKM^{3})\)

code

G

差分约束模板

将每个等式条件看作两个不等式:$ \sum_{j=l_{i}}^{r_{i}}A_{j}=S_{i} $ 可等价于 \(pre_{r_{i}} - pre_{l_{i-1}} = S_{i}\),进一步等价于:

  1. $ pre_{r_{i}} - pre_{l_{i-1}} >= S_{i} $
  2. $ pre_{r_{i}} - pre_{l_{i-1}} <= S_{i} $

且还需要注意到一个约束条件:\(A_{i} > 0\),等价于:

  1. $ pre_{i} - pre_{i - 1} >= 1 $

利用以上三个不等式建图。由于是求最小解,因此等价于求最长路(具体见下方博客链接的讲解)。将以上不等式均改为 \(>=\) 的形式,初始化 \(dist[0] = 0\)\(spfa\) 跑最长路即可。复杂度 \(O(nm)\)

差分约束
code

posted @ 2025-05-07 09:30  jxs123  阅读(34)  评论(0)    收藏  举报