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;