NKOJ 3583 取数游戏
NKOJ 3583 取数游戏
思路
- 暴力:DFS。
- 伪正解:DP。
- 正解:思维方法得到必胜策略。
DP
M1
- 状态:\(dp_{i,j}\) 表示当还剩区间 \([i,j]\) 时可以取到的最大数字。
- 转移:
- 此时,我有两种选择一种是拿 \(i\) ,一种是拿 \(j\) 。
- 对手会选择对我不利的方式拿,于是他会在我拿 \(i\) 时拿 \(i+1\) 或 \(j\)。
- 最后我能拿到的一定是 \(i+2\) 和 \(j-1\) 中较小的那一个。
- 方程
\[dp_{i,j}=
\begin{cases}
arr_i & i=j
\\
\max(arr_i,arr_j) & i=j-1
\\
\max(arr_i+\min(dp_{i+2,j},dp_{i+1,j-1}),arr_j+\min(dp_{i+1,j-1},dp_{i,j-2})) & \operatorname{other}
\end{cases}
\]
- 遍历顺序:由于遍历顺序复杂,直接采用记忆化搜索实现。
- 初始化:在遇到边界时自动完成。
- 答案:\(dp_{i,j}\) 。
M2
- 状态: \(dp_{i,j}\) 表示当还剩区间 \([i,j]\) 时,多的人比少的人多的分值。
- 转移:
- 此时,该我拿,那么上一轮就该对手拿,对手拿完分值一定比我多,在我拿的时候可以拿 \(i\) ,也可以拿 \(j\) 。
- 我跟对手的新的差值应该等于当前我拿的数减去上一轮对手比我多的。
- 方程
\[dp_{i,j}=
\begin{cases}
arr_i & i=j
\\
\operatorname{abs}(arr_i-arr_j) & i=j-1
\\
\max(arr_i-dp_{i-1,j},arr_j-dp_{i,j+1}) & \operatorname{other}
\end{cases}
\]
- 遍历顺序:由于遍历顺序复杂,直接采用记忆化搜索实现。
- 初始化:在遇到边界时自动完成。
- 答案:\(dp_{i,j}\) 。
必胜策略
- 第一次我取时只能取头或尾,其中头的下标为奇数,尾的下标为偶数。
- 如果我取奇数,留给对手的就只有偶数,如果我取偶数,留给对手的就只有奇数。
- 所以观察发现我可以决定自己是全部拿奇数,或全部拿偶数。
- 只需要观察好奇数项的和与偶数项的和那个更大,就可以必胜。

浙公网安备 33010602011771号