首页 > 其他分享 >(nice!!!)LeetCode 312. 戳气球(区间dp ||记忆化dfs )

(nice!!!)LeetCode 312. 戳气球(区间dp ||记忆化dfs )

时间:2024-06-09 12:28:52浏览次数:9  
标签:tmp nums int 312 dfs 区间 LeetCode dp

312. 戳气球

在这里插入图片描述

思路:经典区间dp问题。方法一,区间dp。状态dp[i][j]表示:ij这个区间能获得的最大硬币数量。那么我们就可以枚举区间ij的每一个点,为该区间最后一个戳破的气球。细节看注释

class Solution {
public:
    int maxCoins(vector<int>& nums) {
        int n=nums.size();
        //状态dp[i][j]表示:i~j这个区间能获得的最大硬币数量
        vector<vector<int>> dp(n,vector<int>(n,0));
        //从小到大枚举区间的长度
        for(int lens=1;lens<=n;lens++){
        	//枚举区间的左端点
            for(int i=0;i+lens<=n;i++){
            	//区间的右端点(实际是j-1)
                int j=i+lens;
                //把这个区间i~j外边的气球找出来
                int t=1;
                if(i!=0) t*=nums[i-1];
                if(j!=n) t*=nums[j];
                //枚举区间i~j的每一个点,为该区间最后一个戳破的气球
                for(int k=i;k<j;k++){
                	//计算出最后一个点被搓破前,获得的最大硬币数量。
                    int tmp=0;
                    if(k!=i) tmp+=dp[i][k-1];
                    if(k!=j-1) tmp+=dp[k+1][j-1];
                    //更新区间i~j的最大硬币数量
                    dp[i][j-1]=max(dp[i][j-1],t*nums[k]+tmp);
                }
            }
        }
        //答案自然就是0~n-1这个区间啦
        return dp[0][n-1];
    }
};

思路:方法二,记忆化dfs。区间dp都能做的题,记忆化dfs当然也可以!思路和方法一一样,记忆化dfs的好处就是只需要知道最后一步是干什么的,就可以啦!细节看注释

class Solution {
public:
    int n;
    vector<vector<int>> dp;
    //l:区间左端点、r:区间右端点
    int dfs(int l,int r,vector<int>& nums){
        //if(l>r) return dp[l][r]=0;
        //这里就是记忆化啦,避免大量的重复计算
        if(dp[l][r]!=-1) return dp[l][r];
        //把这个区间l~r外边的气球找出来
        int t=1;
        if(l!=0) t*=nums[l-1];
        if(r!=n-1) t*=nums[r+1];
        //枚举区间l~r的每一个点,为该区间最后一个戳破的气球
        for(int i=l;i<=r;i++){
        	//计算出最后一个点被搓破前,获得的最大硬币数量。
            int tmp=0;
            if(i!=l) tmp+=dfs(l,i-1,nums);
            if(i!=r) tmp+=dfs(i+1,r,nums);
            //更新区间i~j的最大硬币数量
            dp[l][r]=max(dp[l][r],tmp+t*nums[i]);
        }
        return dp[l][r];
    }
    int maxCoins(vector<int>& nums) {
        n=nums.size();
        dp=vector<vector<int>>(n,vector<int>(n,-1));
        
        dfs(0,n-1,nums);
        return dp[0][n-1];
    }
};

标签:tmp,nums,int,312,dfs,区间,LeetCode,dp
From: https://blog.csdn.net/weixin_46028214/article/details/139560246

相关文章

  • Q19 LeetCode24 两两交换链表节点
    1.注意节点交换顺序,以防节点丢失2.ListNodedummy=newListNode(0,head);定义空指针,并指向head节点 好语句3.还是虚拟头结点好用 1classSolution{2publicListNodeswapPairs(ListNodehead){3ListNodedummy=newListNode(0,head);4......
  • Q17 LeetCode707 设计链表
     无1classMyLinkedList{2intsize;3ListNodehead;45publicMyLinkedList(){6size=0;7head=newListNode(0);8}910publicintget(intindex){11if(index<0||index>=size)......
  • 【leetcode 1510 石子游戏】【记忆化搜索】
    存在和对于一切的语言importjava.util.Arrays;classSolution{publicbooleanwinnerSquareGame(intn){dp=newBoolean[n+1];dp2=newBoolean[n+1];Arrays.fill(dp,null);Arrays.fill(dp2,null);dp[0]=fa......
  • 每日一题(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<>(......