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动态规划题组笔记以及总结(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode思维向题笔记总结(持续更新)

leetcode刷题-贪心算法(持续更新)

Leetcode刷题笔记-动态规划

Leetcode 动态规划刷题总结

LeetCode刷题笔记-动态规划-day6

LeetCode刷题笔记-动态规划-day6