leetcode动态规划题组笔记以及总结(持续更新)
Posted 醉生梦死_0423
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode动态规划题组笔记以及总结(持续更新)相关的知识,希望对你有一定的参考价值。
date:20210520
No:1025
title:除数博弈
description:爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。 最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < N 且 N % x == 0 。 用 N - x 替换黑板上的数字 N 。 如果玩家无法执行这些操作,就会输掉游戏。 只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 False。假设两个玩家都以最佳状态参与游戏。
解题方法:
- 动态规划
- 归纳法
解题思路:
- 动态规划:
- 最后一个数字(即n)的状态和前一个因数的状态有关————(解释:爱丽丝轮到的因数会一步一步导致结果,那么我们倒过来,从前往后推,从爱丽丝轮到因数1和2开始推(因为二者是已知的))
- 保存爱丽丝会轮到所有因数的状态(也就是说保存爱丽丝在每一个因数处的结果,以供下一个因数查询————记忆化查询)
- 归纳法:
- 数学方法,本专题主要记录动态规划,所以在此不赘述其他方法,官方有给题解,可以去leetcode看看
实现代码:
- 本题使用python3:
class Solution:
def divisorGame(self, n: int) -> bool:
target = [0 for i in range(n+1)]
target[1] = 0
if n <= 1:
return False
else:
target[2] = 1 # 若爱丽丝抽到2,则爱丽丝赢
for i in range(3,n+1):#因为(3,n)不包括n所以用n+1
for j in range(1,i//2):
if i%j==0 and target[i-j]==0:
target[i] = 1
return target[n] == 1
- 动态规划法通过截图:
以上是关于leetcode动态规划题组笔记以及总结(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章