原题链接:https://leetcode.com/problems/can-i-win/
class Solution {
public:
bool canIWin(int maxChoosableInteger, int desiredTotal) {
int status = 0 ;
if (desiredTotal <= 1) return true;
if ((maxChoosableInteger+1)*maxChoosableInteger < desiredTotal*2) return false;// if sum can not >= desiredTotal, here need use sum formula
vector<unordered_map<int, bool>> dp(desiredTotal+1);
return dfs(dp, status, maxChoosableInteger, desiredTotal);
}
bool dfs(vector<unordered_map<int, bool>> &dp, int status, int max_n, int desired) {
if (dp[desired].count(status)) {
return dp[desired][status];
}
for (int i = max_n - 1; i >= 0 ; --i) {
if (!(status & (1<<i))) {
status |= (1<<i);
if (i+1 >= desired || !dfs(dp, status, max_n, desired-i-1)) {
dp[desired][status] = true;
return true;
}
status ^= (1<<i);
}
}
dp[desired][status] = false;
return false;
}
};