美文网首页
我能赢吗

我能赢吗

作者: 小幸运Q | 来源:发表于2021-03-30 00:24 被阅读0次

image.png

特例一:如果最大能选择的数字maxChoosableInteger比期望的总数desiredTotal要大,先手稳赢,返回True

特例二:如果能选择的所有数字总和比期望的总数desiredTotal要小,一定到达不了desiredTotal,先手稳输,返回False

if(maxChoosableInteger>desiredTotal){
  return True
}
if((1+maxChoosableInteger)*maxChoosableInteger/2 < desiredTotal){
  return False
}

用二进制位来标记某个数是否已被选择,比如01表示1已被选择,10表示2已被选择,11表示1和2都被选择,100表示3被选择,以此类推,1 << (n - 1)1<<(n−1) 表示n已被选择

  • 先1,2再3,4与先4,3后1,2是一样的效果,所以需要基于state记忆性去重而不是罗列所有的情况,因为可以他们的效果一样可以合并。

情况1我抽牌:只要我出某一张牌,对方遍历了所有方法helper(statenow|choosedpoint,value,desired)都是输那我就赢了。
情况2对手抽牌:不论对方抽哪张牌都是死。

class Solution:
    # return 0 我稳输 1 我稳赢
    def helper(self,dp,state,value,maxChoosableInteger,desiredTotal,terms):
        if(dp[state]!=10):
            return dp[state]
        if terms%2==1:
            # 我执手,对手有一种情况全输即可,helper有一个返回1我就能赢
            res=0
            for i in range(0,maxChoosableInteger):
                if res==1:
                    break
                if state&(1<<i)==0:
                    if(value+i+1>=desiredTotal):
                        # now
                        res=1
                        break
                    else:
                        res|=self.helper(dp,state+(1<<i),value+i+1,maxChoosableInteger,desiredTotal,terms+1)
            if(res==1):
                dp[state]=1
                return 1
            else:
                dp[state]=0
                return 0
        else:
            # 对手执手,我helper得全赢helper全返回1我才能赢
            res=1
            for i in range(0,maxChoosableInteger):
                if res==0:
                    break
                if state&(1<<i)==0:
                    if(value+i+1>=desiredTotal):
                        res=0
                        break
                    else:
                        res&=self.helper(dp,state+(1<<i),value+i+1,maxChoosableInteger,desiredTotal,terms+1)
            if(res==1):
                dp[state]=1
                return 1
            else:
                dp[state]=0
                return 0

    def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool:
        # 特殊情况两种
        if desiredTotal<=maxChoosableInteger:
            return True
        if((1+maxChoosableInteger)*maxChoosableInteger/2 < desiredTotal):
            return False
        dp=[10 for i in range(1<<maxChoosableInteger)]
        return self.helper(dp,0,0,maxChoosableInteger,desiredTotal,1)==1

相关文章

  • 我能赢吗

    特例一:如果最大能选择的数字maxChoosableInteger比期望的总数desiredTotal要大,先手稳...

  • 464. 我能赢吗

    464. 我能赢吗 dfs+记忆化+状态压缩

  • 游戏能赢,大学能赢吗?

    “今天又起的比较晚,大概是因昨夜在王者峡谷‘逛’的太晚,被敌方缠住,却想击杀主宰,心里坚持稳住能赢,于是就沉迷其...

  • 智力题

    我能赢吗 输入:maxChoosableInteger = 10desiredTotal = 11输出:false...

  • 苟住,我们能赢

    稳住,我们能赢。我更愿意称之为,苟住,我们能赢。你的目的是什么,为了赢,你愿意放弃很多,甚至苟活下去吗? 前一阵有...

  • 战略共赢

    什么是赢,我比你好,比你强算赢吗?确实这是战术上的赢,可是你能赢多久呢,什么是共赢,是我们都过的更好,共同发展,使...

  • 躺着能赢吗

    天下着雨,有点阴冷。 放假的第一天在床上躺了一天,刷手机,看闲书。 想给自己找点事做,却不知道做啥。 在一个舒适区...

  • 你能躺赢吗?

    生活会无情的让所有想“躺赢”的年轻人,深刻的痛知到--贫贱夫妻百事哀。 恋爱时固然欣喜若狂,因为荷尔蒙会跑赢你们的...

  • 2022-07-27

    自信放光芒 能赢能赢

  • 拖延,我能赢!

    拖延,我能赢! 文/爱乐 本周主题《拖延》——诗大人 我第一个报了...

网友评论

      本文标题:我能赢吗

      本文链接:https://www.haomeiwen.com/subject/vutihltx.html