1.题解
用map记录所有状态的属性,并且依次for循环枚举每一个元素,如果没有访问过就尝试去访问,如果访问过就忽视它继续continue。
class Solution {
public:
bool dfs(int stat,unordered_map<int,int> &dp,int desiredTotal,int maxChoosableInteger){
if(dp.count(stat)) return dp[stat];
for(int i=1; i <= maxChoosableInteger ;i++){
int x = (1<<(i-1));
if((stat & x)!=0) continue;
if(i>=desiredTotal || !dfs(stat|x,dp,desiredTotal-i,maxChoosableInteger)) return dp[stat] = true;
}
return dp[stat] = false;
}
bool canIWin(int maxChoosableInteger, int desiredTotal) {
if(maxChoosableInteger>=desiredTotal)return true;
if(maxChoosableInteger*(maxChoosableInteger+1)/2 < desiredTotal){
return false;
}
unordered_map<int,int> dp;
return dfs(0,dp,desiredTotal,maxChoosableInteger);
}
};