dp-Leetcode题解1025. 除数博弈

最近刷题遇到几道dp给我干碎了,于是决定坚持刷两周的dp题,每道题都写好题解方便以后复习


题目

爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。

最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:

选出任一 x,满足 0 < x < N 且 N % x == 0 。
用 N - x 替换黑板上的数字 N 。
如果玩家无法执行这些操作,就会输掉游戏。

只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 False。假设两个玩家都以最佳状态参与游戏。

1 <= N <= 1000


分析

本题可以从1开始递推,数字为1时,A必败,记1为必败数,再往后的每个数字,寻找是否存在j,使得这个数字减去j以后得到的数字是一个必败数,如果是,则A可以必胜,否则A必败。(如果找不到某个j使得i-j是一个必败数,那么i减去任何一个数都是一个必胜数,那么B就必胜了)


代码

 1 class Solution {
 2 public:
 3     int dp[1001];
 4     bool divisorGame(int N) {
 5         dp[1]=0;
 6         for(int i=2;i<=N;i++)
 7         {
 8             for(int j=1;j<i;j++)
 9             {
10                 if(i%j==0&&dp[i-j]==0)
11                 {
12                     dp[i]=1;
13                     break;
14                 }
15             }
16         }
17         if(dp[N]==1)
18         {
19             return true;
20         }
21         else
22         {
23             return false;
24         }
25     }
26 };

 

上一篇:李宏毅机器学习课程-UnsupervisedLearning0224


下一篇:PAT (Advanced Level) Practice 1141 PAT Ranking of Institutions (25 分) 凌宸1642