1025. 除数博弈(Divisor Game)

    接下来一段时间,都打算做动态规划,记录每次做题方法与心得。

原题网址:https://leetcode-cn.com/problems/divisor-game/solution/

一:本人做法:  

      记result[N]为黑板上数字为N的情况下,Alice的输赢情况, 如果Alice取了数字x, 那么显然dp[N]与dp[N -x]输赢情况相反。x可以取的值很多,只要dp[N -xi]中任意一个为False, 那么dp[N]肯定为True, 否则dp[N]肯定为False。

具体代码(C++):

 bool divisorGame(int N) {
     
        if(N>1000||N<=1)
            return false;
        vector<bool>result(1001,false);
        result[2]=true;
        for(int i=3;i<=N;i++)
        {
            for(int k=1;k<i;k++)
            {
                if(i%k==0)
                {
                    if(result[i-k]==false)
                        result[i]=true;
                } 
            }
        }
        return result[N];
    }

感觉简单的题目都这么多代码,于是有些大佬想办法用几行代码解决,以下为大佬语录:

  • 数字N如果是奇数,它的约数必然都是奇数;若为偶数,则其约数可奇可偶。

  • 无论N初始为多大的值,游戏最终只会进行到N=2时结束,那么谁轮到N=2时谁就会赢。

因为爱丽丝先手,N初始若为偶数,爱丽丝则只需一直选1,使鲍勃一直面临N为奇数的情况,这样爱丽丝稳赢;
        N初始若为奇数,那么爱丽丝第一次选完之后N必为偶数,那么鲍勃只需一直选1就会稳赢。
综述,判断N是奇数还是偶数,即可得出最终结果!

具体代码(C++):

        if(N>1000||N<=1)
            return false;
        if(N%2==0)
            return true;
        else return false;

 

 

 

 

 

    

 

posted on 2019-08-29 23:54  小轩窗~  阅读(304)  评论(0编辑  收藏  举报