G Haitang and Rock Paper Scissors 题解
在竞赛讨论区看 Latex一切正常。
首先考虑朴素dp,
定义 为前 个对手中,在第 个对手出石头/步/剪刀能得到的最大分数为 的方案数。
那么我们最终的答案就是 。
对于状态方程,当前为 ,然后前一个石头/布/剪刀能得到的最大分数为 。
对手出的石头,那么状态方程为 。
对手出的布,那么状态方程为 。
对手出的剪刀,那么状态方程为 。
当我们本轮出石头,那我们对前一轮的布和剪刀取 ,这样一定可以避免连续两轮出一样的手势。
这样的时间复杂度是 的。
我们考虑如何优化,这里我们可以通过转移方程看到,一定有一维是 ,那么我们可以用一个手势来代替这一维。
定义 为前 个对手中,在第 个对手出 能得到的最大分数为 的方案数。
那么答案还是同理 。
对于状态方程,当前为 ,然后前一个 能得到的最大分数为 ,
对手出的 ,那么我们需要考虑 和 的关系。
我们这一轮为 的手势是 ,所以我们第四维一定是 。
所以我们 , 表示取 和 得分的最大值, 表示取 和 得分的最大值 。
定义 。
对于第 轮, 的最大得分为 , 的最大得分为 。
当 时,
- 此时 。
- 表示取 和 得分的最大值,这里为 。
- 表示取 和 得分的最大值 ,这里为 ,因为 是 。
- 所以状态转移方程为 。
当 时,
- 此时 。
- 表示取 和 得分的最大值,这里为 ,因为 是 。
- 表示取 和 得分的最大值 ,这里为 ,因为 是 。
- 所以状态转移方程为 。
当 时,
- 此时 。
- 表示取 和 得分的最大值,这里为 ,因为 是 。
- 表示取 和 得分的最大值 ,这里为 。
- 所以状态转移方程为 。
到这里时间复杂度优化为 。
我们还需要优化时间复杂度。
这里我们可以想到我们无论如何都不可能失败,总可以做到要么赢,要么平局。
那么从这一点,我们的 是一定不会减少的。
所以一但 增加,我们之后的所有方案都不会减少了,而且一但增加,只会增加 ,
那么从这一步开始有多少方案,我们就贡献了 乘上方案个数。
对于某一段的方案数,假设这一段的 的数量为 ,那么这一段的方案数为 。
所以我们需要维护一个 数量的前缀和。
定义 表示第 个到第 个之间有多少个 。
既然只需要 ,我们可以直接维护 ,这样 也可以同时维护。
定义 为前 个对手中,在第 个对手出 能得到的最大分数减去 能得到的最大分数为 的方案数。
对手出的 ,我们还是要考虑 和 的关系。
我们这一轮为 的手势是 ,所以我们第三维一定是 。
所以我们 , 表示取 和 得分的最大值, 表示取 和 得分的最大值 。
定义 。
对于第 轮, 的最大得分为 , 的最大得分为 ,。
当 时,
-
此时 。
-
表示取 和 得分的最大值,这里为 。
-
表示取 和 得分的最大值 ,这里为 ,因为 是 。
-
那么 ,
-
这个式子我们可以轻易的看出当 即 ,得到 。
-
否则得到 。
-
所以状态转移方程为
-
当 时,,
-
否则,。
-
然后 ,
-
此时当 最大值才会变化,也就是说 ,
-
这个式子等价于 。
-
所以当 的时候,我们对答案的贡献为 。
当 时,
-
此时 。
-
表示取 和 得分的最大值,这里为 ,因为 是 。
-
表示取 和 得分的最大值 ,这里为 ,因为 是 。
-
那么 ,
-
所以状态转移方程为
-
-
然后
-
此时只有 最大值才会变化,也就是说 ,
-
这个式子等价于 。
-
所以当 的时候,我们对答案的贡献为 。
当 时,
- 此时 。
- 表示取 和 得分的最大值,这里为 ,因为 是 。
- 表示取 和 得分的最大值 ,这里为 。
- 那么 ,
- 此时当 即 ,得到 ,
- 否则得到 。
- 所以状态转移方程为
- 当 ,,
- 否则,。
- 然后 ,
- 此时无论何时都会发现 都会变大,
- 这个时候直接对答案贡献为 。
最终时间复杂度为 。