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

现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。

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

说明:

  • 你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实存在的所以并不能被戳破。
  • 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

示例:

输入: [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
思路描述: 区间DP,一个状态不行定义两个状态。正推不行反推,从后往前想,枚举最后一个戳破的气球,定义状态dp[i][j]为i到j的所有气球都戳破的最大价值。dp[i][j] = max(dp[i+1][k]+dp[k+1][j]+ input[i-1] * input[k] * input[j+1]);
k为i到j,注意加的价值为位置k气球的价值,以及i-1和j+1位置气球的价值。
class Solution {
public int maxCoins(int[] nums) {
int n = nums.length;
if(n==0) return 0;
if(n==1) return nums[0];
int[][] dp = new int[n][n];
dp[0][0] = nums[0] * nums[1];
dp[n - 1][n - 1] = nums[n - 2] * nums[n - 1];
for (int i = 1; i < n - 1; i++) {
dp[i][i] = nums[i - 1] * nums[i] * nums[i + 1];
} for (int t = 1; t < n; t++) {
for (int i = 0; i < n; i++) {
int j = i + t;
if (j < n) {
for (int k = i ; k <= j ; k++) {
int left = k-1 >= i ? dp[i][k-1]:0;
int right = k+1 <= j ? dp[k+1][j]:0;
int p, q, r;
if (i == 0) p = 1;
else p = nums[i - 1];
if (j == n - 1) r = 1;
else r = nums[j + 1];
q = nums[k];
dp[i][j] = Math.max(dp[i][j], left +right + p * q * r);
}
}
}
}
// for (int i = 0; i < n; i++) {
// for (int j = 0; j < n; j++) {
// System.out.print(dp[i][j] + " ");
// }
// System.out.println();
// }
// System.out.println(dp[0][n - 1]);
return dp[0][n-1];
}
}

leetcode 戳气球的更多相关文章

  1. Burst Balloons(leetcode戳气球,困难)从指数级时间复杂度到多项式级时间复杂度的超详细优化思路(回溯到分治到动态规划)

    这道题目做了两个晚上,发现解题思路的优化过程非常有代表性.文章详细说明了如何从回溯解法改造为分治解法,以及如何由分治解法过渡到动态规划解法.解法的用时从 超时 到 超过 95.6% 提交者,到超过 9 ...

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

    参考:LeetCode 312. Burst Balloons(戳气球) java代码如下 class Solution { //参考:https://blog.csdn.net/jmspan/art ...

  3. Leetcode 312.戳气球

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

  4. Java实现 LeetCode 312 戳气球

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

  5. [Swift]LeetCode312. 戳气球 | Burst Balloons

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...

  6. 312 Burst Balloons 戳气球

    现有 n 个气球按顺序排成一排,每个气球上标有一个数字,这些数字用数组 nums 表示.现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * ...

  7. Q312 戳气球

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

  8. 312. 戳气球【困难】【区间DP】

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

  9. leetcode312 戳气球

    动态规划 time O class Solution { public: int maxCoins(vector<int>& nums) { nums.insert(nums.be ...

随机推荐

  1. [codeforces538D]Weird Chess

    [codeforces538D]Weird Chess 试题描述 Igor has been into chess for a long time and now he is sick of the ...

  2. python学习之-- shelve模块

    shelve模块定义:是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle(因为封装了pickle)可支持的python数据格式.功能:可以实现pickle的多次dump和多次 ...

  3. 从零开始写STL—哈希表

    static const int _stl_num_primes = 28; template<typename T, typename Hash = xhash<T>> cl ...

  4. 毕业bg--hdu1881(01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1881 01 背包  先按发起人离开的时间从小到大排序 然后再套01背包的模板 #include <iost ...

  5. Maven安装和手动安装jar到仓库

    1. 安装Maven 1.下载mvn到本地,解压. 2.新建系统变量MAVEN_HOME,值指向安装目录如D:\apache-maven-3.3.9 3.path变量中增加:%MAVEN_HOME%\ ...

  6. Activiti-5.3工作流引擎-源码解析(流程文档解析)

    前面我们通过BPMN20.xsd和Activiti自定义的XML Schema文件初步了解了业务流程模型的定义,那么现在我们来了解一下流程文档的解析过程,这个过程主要是通过代码解析来完成. 代码解析过 ...

  7. HDU 4786 Fibonacci Tree(生成树,YY乱搞)

    http://acm.hdu.edu.cn/showproblem.php? pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others ...

  8. Python访问MySQL数据库并实现其增删改查功能

    概述:对于访问MySQL数据库的操作,我想大家也都有一些了解.不过,因为最近在学习Python,以下就用Python来实现它.其中包括创建数据库和数据表.插入记录.删除记录.修改记录数据.查询数据.删 ...

  9. AE的Annotation学习摘记

    http://xg-357.blog.163.com/blog/static/36263124201151763512894/ IFeatureWorkspaceAnno pFWSAnno = (IF ...

  10. CentOS 6.x DRBD

    CentOS 6.x DRBD 一.drbd概述     Distributed Replicated Block Device(DRBD)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的 ...