这一题看着“博弈”这个标签觉得很难,但是分析之后发现室友规律的,桌子上有1 2 3个石头的时候,都可以先声夺人,但是4的时候无论怎么办都不行;一旦超过四,比如5个 只要先拿1个 把4个的尴尬局面留给对方,那么对方也会陷入一样的困境;如果拿到六个 只要先拿2个 同理 于是,一开始的想法是:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return bool布尔型
     */
    bool NimGame(int n) {
        // write code here
        vector<bool> dp(n+1,false);
        dp[0]=dp[1]=dp[2]=dp[3]=true;
        int i=4;
        while(i<=n)
        {
            dp[i]=!dp[i-1] || !dp[i-2] || !dp[i-3];
            i++;
        }
        return dp[n];
    }
};

但是遇到的问题是时间复杂度太高,因为需要dp[]三次,会达到O(n^3)

因此,需要优化,参考题解,觉得很有道理,只要能够把模4的局面留给对方就行!当然如果最终余数为0,那么也就没有办法了 于是,有了如下结题方法:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return bool布尔型
     */
    bool NimGame(int n) {
        // write code here
        //本题分析到最后发现,只要可以制造出余下4个石头的局面给对方,就可以胜利,因为其他的局面只要转到4 必胜
        return n%4;

    }
};