题目

有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。

求所能获得硬币的最大数量。

示例

输入:nums = [3,1,5,8]
输出:167
解释:
nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins =  3*1*5    +   3*5*8   +  1*3*8  + 1*8*1 = 167

思路(动态规划)

  • 每戳破一个气球 nums[i]nums[i]nums[i] ,能获得的硬币数量就是 nums[i−1]∗nums[i]∗nums[i+1]nums[i-1] * nums[i] * nums[i+1]nums[i−1]∗nums[i]∗nums[i+1]
    为了考虑越界,就再开一个数组 arr[nums.length+2]arr[nums.length+2]arr[nums.length+2],来存两个边界 1

  • 我们可以枚举最后一个戳爆的气球

  • 定义dp数组,dp[i][j]dp[ i ][ j ]dp[i][j] 表示 戳破 (i,j)(i,j)(i,j) 之间的所有气球,0<=i<n+10 <= i < n+10<=i<n+1

  • 注意如果 i<=ji <= ji<=j 中间是没有气球的,因为是开区间所以k的左右两边的区间不会影响k

  • 采用从下至上和从左往右的遍历方式

代码

class Solution {public int maxCoins(int[] nums) {int len = nums.length;// 定义两个边界考虑到越界情况int[] arr = new int[len+2];// 越界只能获得1个硬币arr[0] = arr[len+1] = 1;for(int i = 1; i < len+1; i++) {arr[i] = nums[i-1];}int[][] dp = new int[len+2][len+2];// 从下往上枚举for (int i = len+1; i >= 0; i--) {// 从左往右枚举 (i < j)for(int j = i+1; j < len+2; j++) {// k要在(i,j)范围内// 枚举最后一个戳爆的气球for (int k = i + 1; k < j; k++) {dp[i][j] = Math.max(dp[i][j],dp[i][k] + dp[k][j] + arr[i]*arr[k]*arr[j]);}}}return dp[0][len+1];}
}

LeetCode 312. 戳气球(Java)相关推荐

  1. Leetcode.312 戳气球

    题目链接 Leetcode.312 戳气球 题目描述 有 n个气球,编号为0到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums中. 现在要求你戳破所有的气球.戳破第 i 个气球,你可 ...

  2. LeetCode 312.戳气球

    LeetCode 312.戳气球 有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.戳破第 i 个气球,你可以获得 num ...

  3. Java实现 LeetCode 312 戳气球

    312. 戳气球 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left ...

  4. leetcode: 312. 戳气球

    312. 戳气球 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/burst-balloons/ 有 n 个气球,编号为0 到 n - 1,每个气球上 ...

  5. LeetCode·312.戳气球·动态规划

    312.戳气球 题目 示例 思路 首先必须要说明,这个题目的状态转移方程真的比较巧妙,所以说如果你看了题目之后完全没有思路恰恰是正常的.虽然最优答案不容易想出来,但基本的思路分析是我们应该力求做到的. ...

  6. Leetcode 312. 戳气球

    题目 首先必须要说明,这个题目的状态转移方程真的比较巧妙,所以说如果你看了题目之后完全没有思路恰恰是正常的.虽然最优答案不容易想出来,但基本的思路分析是我们应该力求做到的.所以本文会先分析一下常规思路 ...

  7. LeetCode 312. 戳气球(DP,难)

    1. 题目 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left]∗n ...

  8. LeetCode 312. 戳气球(Burst Balloons)

    题目描述: 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left] * ...

  9. Leetcode 312. 戳气球(经典区间dp)

    为了避免边界问题,我们重新开一个数组,在两个端点加入哨兵1.此时数组下标为0到n+1 状态的定义如下,f[i][j] 表示将区间[i+1,j-1]的气球全部戳爆的最大收益. 我们要求的答案就是f[0] ...

最新文章

  1. 浅析防御僵尸网络基于应用层的DDOS攻击
  2. 解决ExcelReport导出Excel报Number of rules must not exceed 3错误的问题
  3. NOIP2016提高组复赛解题报告
  4. 【自动驾驶】20.自动驾驶中的各种时空坐标系
  5. 数据中心消防设施常见安装间距汇总
  6. VTK:通过法线显示颜色用法实战
  7. linux部署DM数据库的DEM系统
  8. 云原生数据湖解决方案打破数据孤岛,大数据驱动互娱行业发展
  9. 从自媒体引流到私域池
  10. numpy的结构数组和内存布局
  11. java多线程知识点之wait和sleep的区别
  12. 昆仑通态MCGS与3台欧姆龙E5*C温控器通讯程序功能:通过昆仑通态触摸屏
  13. 未能找到主机服务器是什么鬼,未能找到指定主机服务器是什么意思
  14. 计算机专业实训图片,实训一图片的简单处理_计算机软件及应用_IT计算机_专业资料...
  15. 用代码关闭冰刃(IceSword)
  16. 狄利克雷卷积_积性函数和狄利克雷卷积小结
  17. PMP®项目管理|项目干系人如何管理?
  18. 扎心!为何HR看了你的简历却不通知面试?
  19. 1443:【例题4】Addition Chains
  20. CDN可以防护什么种类的攻击?

热门文章

  1. Saltstack之Grains组件
  2. 索尼计算机bios正确设置,索尼电脑进入bios和设置U盘启动的方法【图文教程】
  3. 修改hosts文件,使一个ip指向多个域名
  4. 十款非常好用的的HTML生成工具推荐
  5. 智能车竞赛-英飞凌TC264核心板-开源
  6. mockjs语法详解
  7. 34一个美丽的生活窍门
  8. python打开zip文件_如何从Python中的zip文件中读取?
  9. 最近遇到的问题 及解决方法
  10. hdu3999二叉排序树