动态规划-击爆气球 Burst Balloons
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相关推荐
- 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 ...
- 无重叠区间及用最少的箭射爆气球
无重叠区间及用最少的箭射爆气球 文章目录 无重叠区间及用最少的箭射爆气球 **一:开胃菜** **二.无重叠区间** **三.用最少的箭射爆气球** 一:开胃菜 在开始所无重叠区间前先做一道简单的提来 ...
- 用少量箭射爆气球,leetcode习题
用少量气球射爆气球 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了.开始坐标总 ...
- Unity特效学习笔记——受击爆点
暗色光晕--一层暗色叠底光晕,选用深色系,范围可大一些,放最下面 亮色光晕--亮色光晕,可稍作一些动态 主体爆点--主体受击爆点,总体动态,往内缩小.贴图可以选择一些星型锐利的.颜色越靠近光晕越亮.用 ...
- 打破气球所能获得的最大积分 Burst Balloons
2019独角兽企业重金招聘Python工程师标准>>> 问题: Given n balloons, indexed from 0 to n-1. Each balloon is pa ...
- LeetCode 312. Burst Balloons(戳气球)
原题网址:https://leetcode.com/problems/burst-balloons/ Given n balloons, indexed from 0 to n-1. Each bal ...
- 贪心:Burst Balloons 最少次数完成射击气球
已知在一个平面上有一定数量的气球,平面可以看作一个坐标系,在平面的x轴的不同位 置安排弓箭手向y轴方向射箭,弓箭可以向y轴走无穷远;给定气球的宽度 xstart ≤ x ≤ xend,问至少需要多少弓 ...
- 312. Burst Balloons 戳气球
Title 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.如果你戳破气球 i ,就可以获得 nums[left] * nu ...
- LeetCode 312. 戳气球(Burst Balloons)
题目描述: 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中. 现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left] * ...
- leetcode 452. Minimum Number of Arrows to Burst Balloons | 452. 用最少数量的箭引爆气球(左程云:最大线段重合问题)
题目 https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/ 题解 重叠区间问题可以总结为在坐标轴上若干个位 ...
最新文章
- Vue父组件调用子组件的方法并传参的两种方式(用$refs.refName.functionName、window.function)
- 云计算安全解决方案白皮书(二)
- 局域网语音通话demo
- system-copy 和 ShellExecute 用法
- js日期格式判断(2018/01/30) -方法 小时分秒格式判断((HH:MM)
- 如何快速掌握oracle,教你如何快速从 Oracle 官方文档中获取需要的知识
- npoi 删除多行 操作excel_NPOI操作excel 2007/2010版本
- decimal double java_Java BigDecimal和double BigDecimal类
- 驱动框架7——使用gpiolib完成led驱动
- mybatis自学笔记-1
- Grafana : 前端页面 通过API Key免登录访问Grafana
- HBase权威指南 高清中文版 PDF(来自linuxidc)
- 尚学堂java 参考答案 第七章
- freeswitch php事件订阅,例子3:事件订阅,监听多个事件
- AcWing135.最大子序和(单调队列DP)
- 详解MAC硬盘中各个文件夹
- xmind8 安装方法(old)
- matlab近似计算求积分,matlab实验三 定积分的近似计算.doc
- oracle怎么表示当天零点,Oracle 取得当天0时0分0秒和23时59分59秒
- 人类首次捕获到反物质 500克能量可超过氢弹