当前位置: 首页 > news >正文

【LeetCode】312.戳气球

题目

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

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

示例 2:

输入:nums = [1,5]
输出:10

提示:

  • n == nums.length
  • 1 <= n <= 300
  • 0 <= nums[i] <= 100

解答

源代码

class Solution {public int[][] res;public int[] val;public int maxCoins(int[] nums) {val = new int[nums.length + 2];val[0] = 1;val[nums.length + 1] = 1;for (int i = 0; i < nums.length; i++) {val[i + 1] = nums[i];}res = new int[nums.length + 2][nums.length + 2];for (int i = 0; i < nums.length + 1; i++) {Arrays.fill(res[i], -1);}return solve(0, nums.length + 1);}// 把戳气球的过程倒过来,计算将开区间(left, right)之间填满气球能得到的最多硬币数public int solve(int left, int right) {// 此时(left, right)之间无法添加气球if (left >= right - 1) {return 0;}if (res[left][right] != -1) {return res[left][right];}for (int i = left + 1; i < right; i++) {int sum = val[left] * val[i] * val[right];sum += solve(left, i) + solve(i, right);res[left][right] = Math.max(res[left][right], sum);}return res[left][right];}
}

总结

每戳一个气球,会使本不相邻的两个气球变得相邻,所以导致后续难以处理。所以我们换个思路,把戳气球的过程倒过来看,变成每次插进一个气球,插进第一个气球时,我们肯定知道它的两边是数字为1的气球(超出数组边界),然后这个气球的左右两边进行递归,也分别当作插进左边和右边的第一个气球。这样以来,每次添加气球时,气球两边的数字就都能够确定了。

在每次递归时,因为当前区间内可以添加气球的位置可能不止一个,那么就需要不断对比得到能获得最大硬币数的一个。

http://www.lryc.cn/news/162315.html

相关文章:

  • 商业数据分析概论
  • Golang GUI框架
  • LeetCode刷题笔记【24】:贪心算法专题-2(买卖股票的最佳时机II、跳跃游戏、跳跃游戏II)
  • 游戏出现卡顿有哪些因素
  • 学习Bootstrap 5的第八天
  • vue中自定义指令
  • Python:安装Flask web框架hello world
  • 小程序点击复制功能制作
  • 20230909java面经整理
  • 常用的css命名规则
  • 【Linux编程Shell自动化脚本】03 shell四剑客(find、sed、grep、awk)
  • java的springboot框架中使用logback日志框架使用RabbitHandler注解为什么获取不到消费的traceId信息?
  • 初探Vue.js及Vue-Cli
  • 大数据课程K21——Spark的SparkSQL基础语法
  • 【实践篇】Redis最强Java客户端(三)之Redisson 7种分布式锁使用指南
  • 卫星通话过后,卫星导航产业被彻底激活
  • 【算法训练-链表 七】【排序】:链表排序、链表的奇偶重排、重排链表
  • LGB的两种写法
  • 【Unity的HDRP下ShaderGraph实现权重缩放全息投影_(内附源码)】
  • 透视俄乌网络战之二:Conti勒索软件集团(上)
  • 【华为OD机试python】拔河比赛【2023 B卷|100分】
  • 05 CNN 猴子类别检测
  • 【C#】关于Array.Copy 和 GC
  • Vue前端框架08 Vue框架简介、VueAPI风格、模板语法、事件处理、数组变化侦测
  • WebStorm使用PlantUML
  • Python做批处理,给安卓设备安装应用和传输图片
  • 如何获取springboot中所有的bean
  • 大数据技术之Hadoop:HDFS存储原理篇(五)
  • 用C语言实现牛顿摆控制台动画
  • 如何自己开发一个前端监控SDK