AT_abc_270_d 总结

发布时间 2023-05-20 20:05:10作者: xiehanrui0817

题目:AT_abc_270_d
链接:洛谷, ATvjudge

题意

  • 有两个人轮流取石子,有 \(n\) 颗石子和长度为 \(k\) 的数组 \(a\),每次取石子的人可以取走 \(a_i\) 颗石子,当然当时剩下的石子数量要 $ \ge a_i$ 才行,若二人都走最优策略,那么先手可以取走都少颗棋子?

  • 数据范围:\(1 \le n \le 10^4, 1 \le k \le 100\)

思路

暴搜

  • 首先我们可以写一个暴力搜索,状态为 \((x, y, 0 / 1)\) 表示取走了 \(x\) 颗棋子,先取石子的人取了 \(y\) 颗,当前位谁取石子(定义 \(1\) 为先手,\(0\) 为后手)。

  • 那么有转移:\((x,y,f) -> (x + a_i, y + a_i \cdot f, f \oplus 1)(1 \le i \le n)\)

  • 时间复杂度

    • 状态数:\(O(n^2)\)
    • 转移数:\(O(n^2k)\)
    • 总时间复杂度:\(O(n^2k)\).

正解

  • 其实这是个博弈题。令 \(dp_{i,f}\) 表示一共取了 \(i\) 个石子,当前操作为 \(f\) 取石子,\(f\) 能得到的最大石子数,那么 \(dp_{i,f} = \max\limits_{j = 1}^k \{x - a_j - dp_{x - a_j}\} = \max\limits_{j = 1}^k \{x - dp_{x - a_j}\}\)

  • 所以就结束了,但是这个题还有更简单的实现方式,因为两个人都实现的最优策略,所以无需分前后手,可以直接省略后面一维。

  • 时间复杂度

    • 状态数:\(O(n)\)
    • 转移数:\(O(nk)\)
    • 总时间复杂度:\(O(nk)\)