LeetCode刷题笔记-DP算法-取数问题

题目描述

(除数博弈论)爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。

最初,黑板上有一个数字 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     }

猜你喜欢

转载自www.cnblogs.com/sqchao/p/11107697.html