LeetCode 石子游戏 IV (DP、最优策略的理解)

石子游戏 IV
这道题用DP来解决,关键就在于理解“最优策略”是什么。
比如在石子的个数为 i i i的时候,Alice是必输的,那么在石子数量为
i + 1 2 , i + 2 2 , i + 3 2 , i + 4 2 , … … i+1^2,i+2^2,i+3^2,i+4^2,…… i+12,i+22,i+32,i+42,的时候,如果ALice想赢,那么他立即取走那个多余的完全平方数,然后局面立即就是Bob必输了,因为此时Bob的开局和之前Alice开局的输法是一样的!

class Solution {
public:
    bool winnerSquareGame(int n) {
        vector<int> dp(n+1);
        dp[0] = 0;
        for(int i=1;i<=n;i++){
            for(int j = 1;j*j<=i;j++){
                if(dp[i]){
                    break;
                }
                dp[i] = !dp[i-j*j] ; 
            }
        }
        return dp[n];
    }
};

下面的写法更符合DP的递推关系。

class Solution {
public:
    bool winnerSquareGame(int n) {
        vector<int> dp(n+1,0);
        dp[0] = 0;
        for(int i=0;i<n;i++){
            if(!dp[i]){
                for(int j = 1;j*j+i<=n;j++){
                    dp[j*j+i] = 1;
                }
            }
        }
        return dp[n];
    }
};

你可能感兴趣的:(LeetCode,#,LC动态规划)