【leetcode C】#1025 除数博弈

题目:

爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作
选出任一 x,满足 0 < x < N 且 N % x == 0 。
用 N - x 替换黑板上的数字 N 。
如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。

代码

bool divisorGame(int N)
{
    int dp[1001];
    memset(dp,0,sizeof(dp));
    dp[1]=0;
    dp[2]=1;
    for(int i=3;i<=N;i++)
    {
        int j=1,book=0;
        while(j<=i/2&&book==0)
        {
            if(i%j==0)
            {
                if(dp[i-j]==0)
                {
                    dp[i]=1;
                    book=1;
                }
            }
            j++;
        }
    }
    if(dp[N]==1)
    return true;
    else
    return false;
}

结果:前1000个数字Alice先手获胜可能依次是(1为获胜,0为失败)
在这里插入图片描述

分析:如图显示1000个数字总是奇数项为0偶数项为1呢,为啥会这样?

由于N=1时,Alice获胜可能为0,N=2时,Alice获胜可能为1。假设,K项之前所有的偶数项都为1,而奇数项都为0,则有K为偶数,一定能取1使得,为Bob剩余N-1奇数项,Bob无获胜可能;若K为奇数项,由于奇数不可能有偶数因子,因此N-x只可能得到偶数,因此Bob总有获胜可能。

猜你喜欢

转载自blog.csdn.net/qq_44381135/article/details/107552168
今日推荐