【LeetCode刷題筆記(四十二)】之 1025. 除數博弈

開發小鴿發表於2020-11-10

本文章由公號【開發小鴿】釋出!歡迎關注!!!


老規矩–妹妹鎮樓:

【LeetCode刷題筆記(四十二)】之 1025. 除數博弈

一. 題目

(一) 題幹

        愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。

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

        選出任一 x,滿足 0 < x < N 且 N % x == 0,        用 N - x 替換黑板上的數字 N 。如果玩家無法執行這些操作,就會輸掉遊戲。

        只有在愛麗絲在遊戲中取得勝利時才返回 True,否則返回 False。假設兩個玩家都以最佳狀態參與遊戲。

(二) 示例

示例 1:

輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃無法進行操作。

示例 2:

輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,然後愛麗絲無法進行操作。

二.題解

(一)思路

        初看題目,這是啥玩意,簡直是閱讀理解題目。細細思考,這又是一個動態規劃的問題,從小值開始不斷地增長,記錄從N=1開始,先手是否會成功。因為,不論Alice開始先手的N是多少,Bob得到的數一定是小於N的,那麼通過判斷Bob得到的數所對應先手成功與否,就能夠直接判斷出Alice是否會成功。如果Bob得到的數先手一定會失敗,那麼Alice一定會成功。

       對於這種博弈問題,一定要從簡單的情況開始推理,多推理幾次,找出規律來!!!


(二) 程式碼實現

Java:

class Solution {
    public boolean divisorGame(int N) {
        boolean[] flag = new boolean[N+5];
        flag[1] = false;
        flag[2] = true;
        for(int i = 3; i <= N; ++i){
            for(int j = 1; j < i; ++j){
                if(i % j == 0 && !flag[i-j]){
                    flag[i] = true;
                    break;
                }
            }
        }
        return flag[N];
    }
}

相關文章