首页 > 其他分享 >【leetcode 1510 石子游戏】【记忆化搜索】

【leetcode 1510 石子游戏】【记忆化搜索】

时间:2024-06-08 20:11:13浏览次数:28  
标签:dp2 int 石子 leetcode boolean true 1510 dp Boolean

存在和对于一切的语言

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;
        }
    }
}

标签:dp2,int,石子,leetcode,boolean,true,1510,dp,Boolean
From: https://www.cnblogs.com/fishcanfly/p/18238901

相关文章

  • 每日一题(LeetCode · 35)搜索插入位置
    题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target......
  • 代码随想录算法训练营第四天 Leetcode 24 两两交换链表节点 Leetcode19 删除链表倒数
    链表问题首先要记住设置虚拟头节点Leetcode24两两交换链表节点题目链接思路:就是简单模拟两两交换 要注意链表节点的处理一定要获取到合适的位置比如:这一题中两个交换节点的前一个节点注意链表保存临时节点/***Definitionforsingly-linkedlist.*publicclas......
  • 【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。
    文章目录117.【中等】填充每个节点的下一个右侧节点指针II114.【中等】二叉树展开为链表129.【中等】求根节点到叶节点数字之和124.【困难】二叉树中的最大路径和173.【中等】二叉搜索树迭代器......
  • (NICE!!!)LeetCode 3040. 相同分数的最大操作数目 II(深度优先搜索dfs+状态记忆化)
    3040.相同分数的最大操作数目II思路:记忆化搜索。一共最多三种target,我们三次记忆化搜索即可。细节看注释classSolution{public:intn;vector<vector<int>>v;//对区间l~r进行操作,返回符合target的最大操作次数intdfs(intl,intr,inttarget,......
  • LeetCode 第72题:编辑距离
    在我们日常生活中,有时候会因为一两个字母的错误,让一段话的意思变得完全不同。就像你给女朋友发信息“我爱你”,结果手一抖发成了“我恨你”,这可不得了。因此,如何衡量两个字符串之间的差异,并将一个字符串变成另一个字符串,这就是编辑距离(EditDistance)问题要解决的核心。文......
  • [leetcode 30 串联所有单词的子串 10ms]
    算法复杂度o(1):复杂最坏复杂度是o(s.length)和o(m*total)的最大值码代码速度要变快,变量,算法要先想清楚importjava.util.*;classSolution{publicList<Integer>findSubstring(Strings,String[]words){m=words[0].length();n=words......
  • Q15 LeetCode54 螺旋矩阵
    1.和上一题主体部分一模一样,加了判断语句2. intm=matrix.length,n=matrix[0].length;二维数组的长度3.List得实例化  1classSolution{2publicList<Integer>spiralOrder(int[][]matrix){34List<Integer>ans=newArrayList<>(......
  • Q14 LeetCode59 螺旋矩阵
    1.二维数组声明  int[][]ans=newint[n][n];2. left<=right&&top<=bottom 跳出循环条件 1classSolution{2publicint[][]generateMatrix(intn){3int[][]ans=newint[n][n];4intnum=1;5inttop=0,bottom=n-1,left......
  • Q13 LeetCode76 最小覆盖子串
    1.难题2.need.containsKey(r)看hashmap中是否含有r3.明天再复盘一遍  1classSolution{2publicStringminWindow(Strings,Stringt){3if(s==null||s.isEmpty()||t==null||t.isEmpty()||s.length()<t.length())return"";4......
  • LeetCode 2559. 统计范围内的元音字符串数
    2559.统计范围内的元音字符串数给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。每个查询 queries[i]=[li,ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。返回一个整......