Leetcode 464.我能赢吗

我能赢吗

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

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

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

给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩家游戏时都表现最佳)?

你可以假设 maxChoosableInteger 不会大于 20, desiredTotal 不会大于 300。

示例:

输入:

maxChoosableInteger = 10

desiredTotal = 11

输出:

false

解释:

无论第一个玩家选择哪个整数,他都会失败。

第一个玩家可以选择从 1 到 10 的整数。

如果第一个玩家选择 1,那么第二个玩家只能选择从 2 到 10 的整数。

第二个玩家可以通过选择整数 10(那么累积和为 11 >= desiredTotal),从而取得胜利.

同样地,第一个玩家选择任意其他整数,第二个玩家都会赢。

DFS + memorizatoin

通过state保存状态,即当前选了哪些数

需要注意maxChoosableInteger不会大于20,我们完全可以通过一个32位的整数来表示状态

例如选择了1和2,那么状态为01 | 10 = 11 = 3(选择的数为1左移位数-1)

 1 class Solution {
 2     public boolean canIWin(int maxChoosableInteger, int desiredTotal) {
 3         if(desiredTotal <= maxChoosableInteger)
 4             return true;
 5         //Note: n should be <= 32 as int is 32-bit in Java; else it will 1 << 33+ equals 0.
 6         int n = maxChoosableInteger;
 7         int sum = n * (n + 1) / 2;
 8         if(sum < desiredTotal)
 9             return false;
10         Boolean[] dp = new Boolean[1 << n];
11         return canIWin(0, n, desiredTotal, dp);
12     }
13
14     private boolean canIWin(int state, int n, int remain, Boolean[] dp) {
15         if (remain <= 0) {
16             //dp[state] = false;
17             // Base case:
18             return false;
19         }
20         if (dp[state] == null) {
21             dp[state] = false;
22             int mask = 1;
23             //Key Point: take from the tail
24             for(int i = 1; i <= n; i++){
25                 int future = state | mask;
26                 //the other can win
27                 if (future != state && !canIWin(future, n, remain - i, dp)) {
28                     //update current status = true
29                     dp[state] = true;
30                     break;
31                 }
32                 mask <<= 1;
33             }
34         }
35         return dp[state];
36     }
37 }


原文地址:https://www.cnblogs.com/kexinxin/p/10280223.html

时间: 2024-11-10 14:23:02

Leetcode 464.我能赢吗的相关文章

状态压缩 - LeetCode #464 Can I Win

动态规划是一种top-down求解模式,关键在于分解和求解子问题,然后根据子问题的解不断向上递推,得出最终解 因此dp涉及到保存每个计算过的子问题的解,这样当遇到同样的子问题时就不用继续向下求解而直接可以得到结果.状态压缩就是用来保存子问题的解的,主要思想是把所有可能的状态(子问题)用一个数据结构(通常是整数)统一表示,再用map把每个状态和对应结果关联起来,这样每次求解子问题时先find一下,如果map里面已经有该状态的解就不用再求了:同样每次求解完一个状态的解后也要将其放入map中保存 状态

464我能赢吗

题目:在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到 100 的玩家,即为胜者.如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100.给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩家游戏

LeetCode 464 - Can I Win - Medium (Python)

In the "100 game," two players take turns adding, to a running total, any integer from 1..10. The player who first causes the running total to reach or exceed 100 wins. What if we change the game so that players cannot re-use integers? For examp

[总结]图

在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为广度优先搜索(BFS)和深度优先搜索(DFS).深度优先搜索,顾名思义即为一条道走到黑的搜索策略,行不通退回来换另外一条道再走到黑,依次直到搜索完成.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思

必胜技巧6

┏┯┓┏┯┓┏┯┓ ┠方┨┠法┨┠篇┨ ┗┷┛┗┷┛┗┷┛ 1.杀码 每期根据上期个位对应下面的数据杀个位3码,毒胆. 0=591 1=026 2=137 3=248 4=359 5=460 6=571 7=682 8=793 9=804 小技巧 SSC小技巧如跨1长时间不出,当开跨8或跨9时就可关注跨1了的!这是ssc出号规律!切记,,切记!! 还有豹子号码如跨0(豹子)长时间不出时,当开跨7或跨5时就可关注了的! 定毒胆妙法 时时彩"三星 定独胆妙法三则 人无完人,彩票中更是没有圣人,推荐几

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

[LeetCode] Can I Win 我能赢吗

In the "100 game," two players take turns adding, to a running total, any integer from 1..10. The player who first causes the running total to reach or exceed 100 wins. What if we change the game so that players cannot re-use integers? For examp

LeetCode — (1)

摘要: Nim Game.WordPattern.Move zeros.First Bad version.Ugly Number五个算法的python实现. 一个月多没更新,大概是因为状态一直不太好吧,有几次打开却不知从何写起.总结一下这一个月多:看了几个算法:接触了hadoop虽然还不算会:会用linux:看了HTML,JS:拿了两个省奖,其中一个真是一直的梦想:加入了一个团队也算是离自己的梦想更近一步:去过自己喜欢的地方:吃吃吃玩玩玩:做了好几件自己喜欢的事:帮到了挺多人:此刻却突然纠结于

[LeetCode] Nim Game 尼姆游戏

You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove th