Leetcode 464. 我能赢吗
本文最后更新于207 天前,其中的信息可能已经过时,如有错误请发送邮件到2446865563@qq.com

1.题目基本信息

1.1.题目描述

在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和 达到或超过 100 的玩家,即为胜者。

如果我们将游戏规则改为 “玩家 不能 重复使用整数” 呢?

例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。

给定两个整数 maxChoosableInteger (整数池中可选择的最大数)和 desiredTotal(累计和),若先出手的玩家能稳赢则返回 true ,否则返回 false 。假设两位玩家游戏时都表现 最佳 。

1.2.题目地址

https://leetcode.cn/problems/can-i-win/description/

2.解题方法

2.1.解题思路

记忆化搜索+状态压缩

2.2.解题步骤

第一步,构建记忆化搜索递归函数。函数返回当前选手在已经选择的数的状态为hasChoose,当前所选数的总和为currentTotal的情况下,是否必胜

第二步,在保证所有待选数字总和大于等于maxChoosableInteger时,调用dfs判断先手是否处于必胜态

3.解题代码

python3代码

class Solution:
    def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool:
        # 思路:记忆化搜索+状态压缩
        # 第一步,构建记忆化搜索递归函数。函数返回当前选手在已经选择的数的状态为hasChoose,当前所选数的总和为currentTotal的情况下,是否必胜
        @cache
        def dfs(hasChoose:int, currentTotal:int) -> bool:
            for i in range(maxChoosableInteger):
                if (hasChoose >> i) & 1 == 0:
                    # > 选择当前数使当前选手直接胜利或者使对手处于必败态,则当前选手处于必胜态
                    if currentTotal + i + 1 >= desiredTotal or not dfs(hasChoose | (1 << i), currentTotal + i + 1):
                        return True
            return False
        # 第二步,在保证所有待选数字总和大于等于maxChoosableInteger时,调用dfs判断先手是否处于必胜态
        return (maxChoosableInteger + 1) * maxChoosableInteger // 2 >= desiredTotal and dfs(0, 0)

4.执行结果

觉得有帮助可以投喂下博主哦~感谢!

作者:geek007

转载请注明文章地址及作者哦~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇