程式語言 - LeetCode - C++ - 464. Can I Win



題目:


解答:

class Solution {
private:
    unordered_map<int, bool> mp;

public:
    bool canIWin(int maxChoosableInteger, int desiredTotal) {
        auto dfs = [&](this auto&& dfs, int mask, int remain, int max_num) {
            if (mp.count(mask)) {
                return mp[mask];
            }

            for (int i = 1; i <= max_num; ++i) {
                int bit = 1 << i;

                if (!(mask & bit)) {
                    if (i >= remain) {
                        return mp[mask] = true;
                    }

                    if (!dfs(mask | bit, remain -i, max_num)) {
                        return mp[mask] = true;
                    }
                }
            }

            return mp[mask] = false;
        };

        if (desiredTotal <= 0) {
            return true;
        }

        int sum = (maxChoosableInteger * (maxChoosableInteger + 1) ) >> 1;
        if (sum < desiredTotal) {
            return false;
        }

        return dfs(0, desiredTotal, maxChoosableInteger);
    }
};