state = state | (1 << i)
(state & (1 << i)) != 0 // 表示位标记
// 464. 我能赢吗? https://leetcode-cn.com/problems/can-i-win/
// 记忆化dfs、博弈
class Solution {
public:
map<pair<int, int>, bool> mp; // <state, sum>, ret
bool canIWin(int maxChoosableInteger, int desiredTotal) {
if ((1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal) {
return false;
}
for (int i = 1; i <= maxChoosableInteger; i++) {
if (dfs(maxChoosableInteger, desiredTotal, 1 << i, i)) {
return true;
}
}
return false;
}
bool dfs(int maxChoosableInteger, int desiredTotal, int state, int sum)
{
if (sum >= desiredTotal) {
return true;
}
if (mp.count({state, sum})) {
return mp[{state, sum}];
}
bool ret = true;
for (int i = 1; i <= maxChoosableInteger; i++) {
if ((state & (1 << i)) != 0) {
continue;
}
if (dfs(maxChoosableInteger, desiredTotal, (state | (1 << i)), sum + i) == true) {
ret = false; // 后手赢了,表示当前手输了,返回false
break;
}
}
mp[{state, sum}] = ret;
return ret;
}
};