问题描述
笔记
设置buff[i]为:有i个硬币的时候第一个玩家是赢还是输。
- 如果buff[i-1]和buff[i-2]都是赢,那我一开始无论取1个还是2个,对方都可以赢。(我取完之后可以看做对方是先手)
- 如果buff[i-1]是赢,buff[i-2]是输,那我一开始就取2个,对方剩下i-2个只能输。那就是我可以赢。
- 如果buff[i-2]是赢,buff[i-1]是输,那我一开始就取1个,对方剩下i-1个只能输。那就是我可以赢。
- 如果buff[i-1]和buff[i-2]都是输,那我就怎么拿对方都输了。
综上:状态转移方程为:
buff[i] = !(buff[i-1] && buff[i-2])
代码
class Solution {
public:
/**
* @param n: an integer
* @return: a boolean which equals to true if the first player will win
*/
bool firstWillWin(int n) {
// write your code here
if (n == 0)
return false;
if (n == 1 || n == 2)
return true;
bool pre = true;
bool now = true;
for (int i = 3; i <= n; i++)
{
bool tmp = now;
now = !(pre && now);
pre = tmp;
}
return now;
}
};