2018-10-03 19:29:43

问题描述:

问题求解:

很有意思的题目,首先想到的是暴力遍历解空间,当然也用到了memo,可惜还是TLE,因为时间复杂度确实有点过高了,应该是O(n!)。

    Map<LinkedList, Integer> map = new HashMap<>();public int maxCoins(int[] nums) {if (nums.length == 0) return 0;LinkedList<Integer> list = new LinkedList<>();for (int i : nums) list.add(i);return helper(list);}private int helper(LinkedList<Integer> list) {if (list.size() == 1) return list.get(0);if (map.containsKey(list)) return map.get(list);int res = 1;ArrayList<Integer> arr = new ArrayList<>(list);for (int i = 0; i < list.size(); i++) {int pre = i == 0 ? 1 : arr.get(i - 1);int cur = arr.get(i);int next = i == arr.size() - 1 ? 1 : arr.get(i + 1);list.remove(i);res = Math.max(res, pre * cur * next + helper(list));list.add(i, cur);}map.put(list, res);return res;}

本题给出了数据规模,基本已经提示了时间复杂度为O(n^3)左右比较合适。下面给出本题的标准解法,使用的是动态规划算法。

dp[i][j]:nums[i]到nums[j]能获得的最高分数

dp[i][j] = max(dp[i][k - 1] + nums[i - 1] * nums[k] * nums[j + 1] + dp[k + 1][j]) i <= k <= j   // 每次挑选一个最后打爆的气球可以将问题规模下降

给原问题加上padding可以更方便编程。

    public int maxCoins(int[] nums) {if (nums.length == 0) return 0;int n = nums.length;int[] numsPadding = new int[n + 2];numsPadding[0] = 1;numsPadding[n + 1] = 1;for (int i = 1; i <= n; i++) numsPadding[i] = nums[i - 1];int[][] dp = new int[n + 2][n + 2];for (int len = 1; len <= n; len++) {for (int i = 1; i <= n - len + 1; i++) {int j = i + len - 1;for (int k = i; k <= j; k++) {dp[i][j] = Math.max(dp[i][j], dp[i][k - 1] + numsPadding[i - 1] * numsPadding[k] * numsPadding[j + 1] + dp[k + 1][j]);}}}return dp[1][n];}

错误记录:

初始化的时候想当然的认为len == 1的时候结果的数值为numspadding[i],导致失败。

转载于:https://www.cnblogs.com/hyserendipity/p/9740509.html

动态规划-击爆气球 Burst Balloons相关推荐

  1. 452 Minimum Number of Arrows to Burst Balloons

    452 Minimum Number of Arrows to Burst Balloons 文章目录 452 Minimum Number of Arrows to Burst Balloons 1 ...

  2. 无重叠区间及用最少的箭射爆气球

    无重叠区间及用最少的箭射爆气球 文章目录 无重叠区间及用最少的箭射爆气球 **一:开胃菜** **二.无重叠区间** **三.用最少的箭射爆气球** 一:开胃菜 在开始所无重叠区间前先做一道简单的提来 ...

  3. 用少量箭射爆气球,leetcode习题

    用少量气球射爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了.开始坐标总 ...

  4. Unity特效学习笔记——受击爆点

    暗色光晕--一层暗色叠底光晕,选用深色系,范围可大一些,放最下面 亮色光晕--亮色光晕,可稍作一些动态 主体爆点--主体受击爆点,总体动态,往内缩小.贴图可以选择一些星型锐利的.颜色越靠近光晕越亮.用 ...

  5. 打破气球所能获得的最大积分 Burst Balloons

    2019独角兽企业重金招聘Python工程师标准>>> 问题: Given n balloons, indexed from 0 to n-1. Each balloon is pa ...

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

    原题网址:https://leetcode.com/problems/burst-balloons/ Given n balloons, indexed from 0 to n-1. Each bal ...

  7. 贪心:Burst Balloons 最少次数完成射击气球

    已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓 ...

  8. 312. Burst Balloons 戳气球

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

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

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

  10. leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)

    题目 https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/ 题解 重叠区间问题可以总结为在坐标轴上若干个位 ...

最新文章

  1. Vue父组件调用子组件的方法并传参的两种方式(用$refs.refName.functionName、window.function)
  2. 云计算安全解决方案白皮书(二)
  3. 局域网语音通话demo
  4. system-copy 和 ShellExecute 用法
  5. js日期格式判断(2018/01/30) -方法 小时分秒格式判断((HH:MM)
  6. 如何快速掌握oracle,教你如何快速从 Oracle 官方文档中获取需要的知识
  7. npoi 删除多行 操作excel_NPOI操作excel 2007/2010版本
  8. decimal double java_Java BigDecimal和double BigDecimal类
  9. 驱动框架7——使用gpiolib完成led驱动
  10. mybatis自学笔记-1
  11. Grafana : 前端页面 通过API Key免登录访问Grafana
  12. HBase权威指南 高清中文版 PDF(来自linuxidc)
  13. 尚学堂java 参考答案 第七章
  14. freeswitch php事件订阅,例子3:事件订阅,监听多个事件
  15. AcWing135.最大子序和(单调队列DP)
  16. 详解MAC硬盘中各个文件夹
  17. xmind8 安装方法(old)
  18. matlab近似计算求积分,matlab实验三 定积分的近似计算.doc
  19. oracle怎么表示当天零点,Oracle 取得当天0时0分0秒和23时59分59秒
  20. 人类首次捕获到反物质 500克能量可超过氢弹

热门文章

  1. Low-Light Enhancement 数据集 和 论文代码
  2. 第一财经专访李旭阳:反诈骗、管控金融风险,腾讯安全发力联邦学习技术
  3. 【Python爬虫】IOS苹果商店指定APP评论爬取
  4. 第一次用HTML设计表格,以及使用百度脑图的感受
  5. web前端开发技术期末考试_Web前端开发技术期末试题1
  6. 2021年度总结及2022展望
  7. skynet框架应用 (十四) 登录服务
  8. 作为一名31岁的软件测试员,工作3年,月薪不到2W,担心被应届生取代
  9. 南邮《网络技术与应用,携程开源的分布式apollo技术
  10. android wifi分享文件下载,WiFi文件共享