题目大意
https://leetcode.com/problems/can-i-win/
一种博弈游戏,甲乙二人分别从1….n中取数字,要求不重复取,有一个公共的累积和sum,每次两人取完数字之后sum值增加,如果谁某次取完之后sum>=total,那么他赢了。n和total都是题目给定的值。假定二人都是足够的聪明,你是甲作为先手,判断你是否能够取胜。
题目分析
记忆化搜索,注意n个数字取或不取的状态要用一个位保存,map中key是sum和s,value是true/false,至于如何保证根据sum和s生成key的唯一性,注意到n不超过20,total不超过300,n和total拼接成的二进制串也不会超过32,因此用位移并拼接就可以了。更详细的步骤可以看下注释。
代码
|
|
时间复杂度:O(maxChoosableInteger^3 * maxChoosableInteger)