存在和對於一切的語言
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;
}
}
}