【leetcode 1510 石子游戲】【記憶化搜尋】

fishcanfly發表於2024-06-08

存在和對於一切的語言

import java.util.Arrays;

class Solution {
    public boolean winnerSquareGame(int n) {
        dp = new Boolean[n + 1];
        dp2 = new Boolean[n + 1];

        Arrays.fill(dp, null);
        Arrays.fill(dp2, null);

        dp[0] = false;
        dp2[0] = true;

        return dfs(n, true);
    }

    // dp[i] 表示以i為狀態的Alice開始操作的結果
    Boolean[] dp;
    // dp2[i] 表示以i為狀態的Bob開始操作的alice的結果
    Boolean[] dp2;

    public static void main(String[] args) {
        Solution solution = new Solution();
        boolean flag = solution.winnerSquareGame(2);
        System.out.println(flag);
    }


    public boolean dfs(int n, boolean isAlice) {
        if (isAlice) {
            if (dp[n] != null) {
                return dp[n];
            }
            // n 沒有visited;判存在
            // 存在一個i dfs(n, true) 為true
            boolean flag = false;
            for (int i = 1; i * i <= n && !flag; i++) {
                // alice 拿了i*i後的結果
                flag = flag | dfs(n - i * i, false);
            }
            dp[n] = flag;
            return flag;
        } else {
            if (dp2[n] != null) {
                return dp2[n];
            }
            // flag 表示alice贏的結果
            boolean flag = true;
            for (int i = 1; i * i <= n && flag; i++) {
                // bob 拿了i*i後的結果
                flag = flag & dfs(n - i * i, true);
            }
            dp2[n] = flag;
            return flag;
        }
    }
}

相關文章