Can I Win

题目
In the "100 game," two players take turns adding, to a running total, any integer from 1..10. The player who first causes the running total to reach or exceed 100 wins.

What if we change the game so that players cannot re-use integers?

For example, two players might take turns drawing from a common pool of numbers of 1..15 without replacement until they reach a total >= 100.

Given an integer maxChoosableInteger and another integer desiredTotal, determine if the first player to move can force a win, assuming both players play optimally.

You can always assume that maxChoosableInteger will not be larger than 20 and desiredTotal will not be larger than 300.

答案

class Solution {
    public boolean canIWin(int maxChoosableInteger, int desiredTotal) {
        if(maxChoosableInteger * (maxChoosableInteger + 1) / 2 < desiredTotal) return false;
        if(desiredTotal <= 0) return true;
        int[] dp = new int[1 << maxChoosableInteger];
        return recur(maxChoosableInteger, desiredTotal, 0, dp);
    }

    // after the first player makes a move, no matter what the other player does, i can win
    private boolean recur(int maxChoosableInteger, int desiredTotal, int state, int[] dp) {
        if(desiredTotal <= 0) return false;
        if(dp[state] != 0) return dp[state] == 1;

        for(int i = 0; i < maxChoosableInteger; i++) {
            if((state & (1 << i)) == 0) {
                boolean ret = recur(maxChoosableInteger, desiredTotal - (i + 1), state | (1 << i), dp);
                if(!ret) {
                    dp[state] = 1;
                    return true;
                }
            }
        }
        dp[state] = -1;
        return false;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容