文章目录

  • 题目描述
  • 思路 && 代码
    • 二刷

题目描述

  • 一眼动态规划,但思路确实不好想
  • 面试被问过,直接人没了= =

思路 && 代码

  • 核心思路:关心【最后一个被爆的气球】,自底向上进行动态规划
class Solution {// 思路:关心【最后一个被爆的气球】,就不用关心后效性了(毕竟之后已经没有气球了)public int maxCoins(int[] nums) {// 1. init: 处理开头、结尾边界(数字为 1 的气球)int n = nums.length;int[] temp = new int[n + 2];temp[0] = 1;temp[n + 1] = 1;for(int i = 0; i < n; i++) {temp[i + 1] = nums[i];}// 2. dp[i][j]: 开区间 (i, j) 的最大收益int[][] dp = new int[n + 2][n + 2];// 1)从小到大,开区间大小从 3 开始for(int len = 3; len <= n + 2; len++) {// 2)左边界for(int i = 0; i <= n + 2 - len; i++) {int res = 0;// 3)被害气球k,取值范围开区间(i, i + len)for(int k = i + 1; k < i + len - 1; k++) {int left = dp[i][k];int right = dp[k][i + len - 1];// 迭代维护当前 i 开头,大小为 len 的区间,可取的最大值res = Math.max(res, left + temp[i] * temp[k] * temp[i + len - 1] + right);}// 更新(i, i + len - 1)最大利益值dp[i][i + len - 1] = res;}}return dp[0][n + 1];}
}
  • 无注释版
class Solution {public int maxCoins(int[] nums) {int n = nums.length;int[] temp = new int[n + 2];temp[0] = 1;temp[n + 1] = 1;for(int i = 0; i < n; i++) {temp[i + 1] = nums[i];}int[][] dp = new int[n + 2][n + 2];for(int len = 3; len <= n + 2; len++) {for(int i = 0; i <= n + 2 - len; i++) {int res = 0;for(int k = i + 1; k < i + len - 1; k++) {int left = dp[i][k];int right = dp[k][i + len - 1];res = Math.max(res, left + temp[i] * temp[k] * temp[i + len - 1] + right);}dp[i][i + len - 1] = res;}}return dp[0][n + 1];}
}

二刷

  • 再放送!还是觉得思路很强,期待三刷的时候能一股脑写出来!
class Solution {public int maxCoins(int[] nums) {// 1、init: 数组头尾都添加元素 1int[] arr = new int[nums.length + 2];arr[0] = 1; arr[nums.length + 1] = 1;for(int i = 1; i <= nums.length; i++) {arr[i] = nums[i - 1];}// 2、dp过程,三重循环1)2)3)int[][] dp = new int[arr.length][arr.length]; // dp[i][j]: 开区间 (i, j) 的最大值// 1)开区间长度 len:初始为 3,最大为 arr.lengthfor(int len = 3; len <= arr.length; len++) {// 2)左边界 i:初始为 0,最大为长度为 len 的开区间的最大值for(int i = 0; i < arr.length - len + 1; i++) {int res = 0;// 3)被害气球 j:从(i, i + len - 1)中选一个被害气球 j for(int j = i + 1; j < i + len - 1; j++) {// 最优子结构 left、rightint left = dp[i][j];int right = dp[j][i + len - 1];// 状态转移方程:子结构 + 爆炸取值res = Math.max(res, left + arr[i] * arr[j] * arr[i + len - 1] + right);}// 每次获取(i, i + len - 1)的dp值,即范围(i, i + len - 1)的最大值dp[i][i + len - 1] = res;}}return dp[0][arr.length - 1]; // 返回整个数组的最大值}
}
  • 趁热手打
class Solution {public int maxCoins(int[] nums) {int[] arr = new int[nums.length + 2];arr[0] = 1;arr[nums.length + 1] = 1;for(int i = 1; i < arr.length - 1; i++) {arr[i] = nums[i - 1];}int[][] dp = new int[arr.length][arr.length];for(int len = 3; len <= arr.length; len++) {for(int i = 0; i < arr.length - len + 1; i++) {int res = 0;for(int j = i + 1; j < i + len - 1; j++) {int left = dp[i][j];int right = dp[j][i + len - 1];res = Math.max(res, left + arr[i] * arr[j] * arr[i + len - 1] + right);}dp[i][i + len - 1] = res;}}return dp[0][arr.length - 1];}
}

【LeetCode笔记】312. 戳气球(Java、动态规划)相关推荐

  1. 【LeetCode】312. 戳气球

    312. 戳气球(困难) 解法一:动态规划 首先看一个区间: 区间(i,j) 是一个开区间,因为我们只能戳爆 i 和 j 之间的气球,不能戳爆索引为 i 和 j 的气球. 我们不妨考虑该区间内被戳爆的 ...

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

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

  3. Java实现 LeetCode 312 戳气球

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

  4. Leetcode.312 戳气球

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

  5. leetcode: 312. 戳气球

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

  6. LeetCode 312.戳气球

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

  7. Leetcode 312. 戳气球

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

  8. 312戳气球——力扣算法系列2020.07.19 Python

    第25天 2020.07.19 周日 难度系数:困难 题目:有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中. 现在要求你戳破所有的气球.如果你戳破气球i,就可以获得 ...

  9. LeetCode 312. 戳气球(Java)

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

最新文章

  1. 11月12日云栖精选夜读 | 2135亿!新技术的力量刚刚开始
  2. python discuz搜索api_Python + Bottle + 谷歌搜索Api 实现简单搜索引擎
  3. linux 更改文件夹大小,Linux下改变文件大小
  4. idea中,springboot项目部署到docker
  5. CSS定位和浮动(吸顶、居中)
  6. Blazor确认复选框组件
  7. HDUOJ-----I NEED A OFFER!
  8. ueditor编辑器初始化
  9. eros --- Windows Android真机调试
  10. jsp el 表达式_JSP表达式语言– JSP EL示例教程
  11. linux 会话 进程组 守护进程
  12. 7-8 猜数字 (20 分)
  13. 25_删除分类(一对多的删除)
  14. case 在oracle和mysql_Mysql oracle casewhen 完美应用
  15. Cookie起源与发展
  16. 视频黑屏检测,时长检测 blackdetect
  17. 软件需求分析的五个步骤_建立满足用户需求的云的5个步骤
  18. t460p加固态硬盘 thinkpad_联想T460p加装固态硬盘
  19. 【优秀课设】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别 视频随时标注)
  20. 浙江大学计算机专业博导大牛,重磅!官方公布的“最强人脉高校”,校友全是大牛!...

热门文章

  1. java--自动装箱,拆箱
  2. 2017年网易校招题 解救小易
  3. stm32f103移植到f0_STM32F042替换STM32F103
  4. java开发项目实例_Alibaba内部出品Java突击手册,大量开发实战项目分享
  5. 反弹式木马原理_汽车避震器的原理与改装问题
  6. Python计算信息熵
  7. Python安装工具包踩过的坑
  8. BaseActivity与BaseFragment的封装
  9. 从输入URL到页面显示的过程
  10. C++学习之路 | PTA(天梯赛)—— L2-007 家庭房产 (25分)(带注释)(并查集)(精简)