这一题看着“博弈”这个标签觉得很难,但是分析之后发现室友规律的,桌子上有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;
}
};