题解:CF1185G2 Playlist for Polycarp (hard version)
注意到编号最多只有三种,我们考虑单独算每种编号的方案数。
设 \(f_{i, j, k, l}\) 为不考虑顺序的放 \(i\) 个编号为 \(1\),\(j\) 个编号为 \(2\),\(k\) 个编号为 \(3\),最后一个编号为 \(l\) 的方案数,根据定义有显然的转移,这里不过多赘述。那么对于真正的放 \(i\) 个 \(1\) 和 \(j\) 个 \(2\) 和 \(k\) 个 \(3\) 的方案数 \(F_{i, j, k}\),显然为:
\[F_{i, j, k} = \sum_{l = 1} ^ 3 f_{i, j, k, l} \times i! \times j! \times k!
\]
乘三个的阶乘是因为真正的方案数内部是有顺序的。
现在我们为了求答案,可以再设 \(dp_{i, j, k}\) 表示编号为 \(k\) 放了 \(j\) 个占用 \(i\) 的时间方案数,转移类似二维背包,对于第 \(i\) 首歌有:
\[dp_{j, k, g_i} = dp_{j, k, g_i} + dp_{j - 1, k - t_i, g_i}
\]
注意这里转移默认了滚动数组优化。那么最后算答案可以枚举每个编号所占时间和个数。设有 \(i\) 个编号为 \(1\) 占用时间 \(t1\),\(j\) 个编号为 \(2\) 占用时间 \(t2\),\(k\) 个编号为 \(3\) 占用时间 \(t3\),显然 \(t3 = T - t1 - t2\),所以我们只需要枚举 \(5\) 个东西,我们注意到显然有很多的 \(dp\) 值都为 \(0\) 可以跳过不枚举,常数优化的具体细节可以看代码,优化之后会跑得很快。总结一下答案为:
\[\sum_i \sum_{t1} [dp_{i, t1, 1} > 0] \sum_j \sum_{t2} [dp_{j, t2, 2} > 0] [t1 + t2 \le T] \sum_k F_{i, j, k} \times dp_{i, t1, 1} \times dp_{j, t2, 2} \times dp_{k, T - t1 - t2, 3}
\]
做完了。

浙公网安备 33010602011771号