原题
1025.除数博弈
2020年7月24日 每日一题
题解
方法一 数学判断
奇输偶赢。
本思路java代码示例:
//2020.05.13 17:41
//执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
//内存消耗 :36.7 MB, 在所有 Java 提交中击败了10.00%的用户
class Solution {
public boolean divisorGame(int N) {
return N%2==0;
}
}
/*
数字N如果是奇数,它的约数必然都是奇数;若为偶数,则其约数可奇可偶。
无论N初始为多大的值,游戏最终只会进行到N=2时结束,那么谁轮到N=2时谁就会赢。
因为爱丽丝先手,N初始若为偶数,爱丽丝则只需一直选1,使鲍勃一直面临N为奇数的情况,这样爱丽丝稳赢;
N初始若为奇数,那么爱丽丝第一次选完之后N必为偶数,那么鲍勃只需一直选1就会稳赢。
综述,判断N是奇数还是偶数,即可得出最终结果!
作者:coder233
链接:https://leetcode-cn.com/problems/divisor-game/solution/qi-shi-shi-yi-dao-shu-xue-ti-by-coder233/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
方法二 dp
根据观察,我么知道N=1 的时候假,N=2的时候假,那么我们从3开始只要能够找到,在N=n的时候,一个n-m(其中m为n的某个非n的约数,使得那时候必输即可(此时必输基于两者身份互换))情况下会输的时候,那么这一次就肯定会赢。
本方法java代码示例:
/*
@v7fgg
执行用时:6 ms, 在所有 Java 提交中击败了16.95%的用户
内存消耗:36.5 MB, 在所有 Java 提交中击败了10.00%的用户
2020年7月24日 8:17
*/
class Solution {
public boolean divisorGame(int N) {
if(N==1){return false;}
if(N==2){return true;}
boolean ans[]=new boolean[N+1];
ans[0]=ans[2]=true;
for(int i=3;i<=N;i++){
for(int j=1;j<i-1;j++){
if(i%j==0&&!ans[j-1]){
ans[i]=true;
break;
}
}
}
return ans[N];
}
}