状态表示
考虑状态state[step][mouse][cat]={0, 1, 2}
,表示第step步后,老鼠在mouse位置,猫在cat位置,此时猫和老鼠在最佳状态下的游戏结局。
初始化
根据游戏规则,我们可以直接推理出
- 老鼠必胜:
state[step][0][cat] = 1
- 猫必胜:
state[step][i][i] = 2
- 根据抽屉原理,当只能走
t
个点时,第t+1
步必然与前面的某一步重复,根据题意猫只能走n-1
个点,老鼠可以走n
个点,那么当猫走了n-1
步,老鼠走了n
步后,猫的下一步必然会落在猫之前走过的点上,可以得到state[2*n][i][j] = 0
状态转移
- 轮到老鼠走时,
target
表示老鼠可以走到的下个节点- 当存在
state[step+1][target][cat]=1
时,当前状态下老鼠必胜 - 否则,当存在
state[step+1][target][cat]=0
时,老鼠必然选择和棋策略 - 否则,老鼠必输
- 当存在
- 轮到猫走时,和老鼠的状态是一样的,但需要注意对于猫
target!=0
时间复杂度计算
step, mouse, cat取值都是O(n),在记忆化搜索的情况下,总体搜索的复杂度为O(n^3)