(除数博弈论)爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。
最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:
选出任一 x,满足 0 < x < N 且 N % x == 0 。
用 N - x 替换黑板上的数字 N 。
如果玩家无法执行这些操作,就会输掉游戏。
只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divisor-game
从前往后分析:当前结果,仅与之前的的结果相同。即:存在最有子结构->动态规划
if(i %j==0 && dp[i-j]==0) //在i个数中,取j个,剩个i-j个先手必输
dp[i]==1;
1 1 public boolean divisorGame(int N) { 2 2 int[] res = new int[N+1]; 3 3 res[1]=0; 4 4 for(int i=2;i<=N;i++){ 5 5 if(res[i-1]==0) //i时,先手失败,则i+1,取一个,将先手丢给对方,稳赢 6 6 res[i]=1; 7 7 else{ 8 8 res[i]=0; 9 9 //当我取完之后,剩下的数字为先手必输。则我必赢 10 10 for(int j=1;j<i;j++){ //我取了j, 11 11 if(i%j==0 && res[j]==0) 12 12 res[i]=1; 13 13 } 14 14 } 15 15 } 16 16 17 17 if(res[N]==1) 18 18 return true; 19 19 return false; 20 20 }
原文:https://www.cnblogs.com/sqchao/p/11107697.html