有 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

思路分析:
coins[i][j]表示的将下标(i,j)戳破可获得的最大值
coins[j][j+i] = max(coins[j][j+i], coins[j][k] + coins[k][j+i] + dpnums[j] * dpnums[k] * dpnums[j+i]);//k是(i,j)里面最后戳破的气球下标

class Solution {
public:int maxCoins(vector<int>& nums) {vector<int> dpnums(nums.size() + 2, 1);//将nums数组进行扩展[1,nums[0], nums[1], ... nums[n], 1]for(int i=0, j=1; i < nums.size(); i++, j++){dpnums[j] = nums[i];}vector<vector<int>> coins(dpnums.size(), vector<int>(dpnums.size(), 0));//coins[i][j]表示的将下标(i,j)戳破可获得的最大值int dpNumsSize = dpnums.size();for(int i = 2; i < dpNumsSize; i++) {for(int j = 0; j + i < dpNumsSize; j++) {//上面两层循环用于控制(j,i)的窗口的长度和移动//下面的循环用于穷举区间(i, j)中最后一个戳破的气球下标,从而确定窗口(i,j)戳破可得的最大值for(int k = j + 1; k < j + i; k++) {//coins[j][k] + coins[k][j+i]戳破(i,k)和(k,j)可获得的值//dpnums[j] * dpnums[k] * dpnums[j+i]戳破k可获得的值coins[j][j+i] = max(coins[j][j+i], coins[j][k] + coins[k][j+i] + dpnums[j] * dpnums[k] * dpnums[j+i]);}}}return coins[0][dpNumsSize - 1];}
};

这道题用动态规划,感觉太精妙了。

LeetCode 戳气球(动态规划)相关推荐

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

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

  2. [Leetcode][第312题][JAVA][戳气球][动态规划][记忆化搜索]

    [问题描述][困难] [解答思路] 1. 记忆化搜索 时间复杂度:O(n^3) 空间复杂度:O(n^2) class Solution {public int[][] rec;public int[] ...

  3. 【LeetCode】312. 戳气球

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

  4. Leetcode 312. 戳气球

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

  5. 经典动态规划:戳气球问题

    点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong   公众号:labuladong 若已授权白名单也必须保留以上来源信息 今天我们要聊的这道题「Burst Balloon」和之 ...

  6. 算法学习笔记——动态规划:戳气球

    LeetCode 312. 戳气球 数组 nums 中,保存了每个气球上的数字,戳破一个气球,得分是nums[i - 1] * nums[i] * nums[i + 1](若越界,认为两个边界上有数值 ...

  7. Leetcode.312 戳气球

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

  8. leetcode: 312. 戳气球

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

  9. leetcode:戳气球 leetcode:零钱兑换

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

最新文章

  1. 【VMC实验室】在QCloud上创建您的SQL Cluster(1)
  2. Camel之AsyncProcessor
  3. matlab创建mat格式变量并导入数据
  4. 《20年后,你靠什么生存(孙继滨)》讲座观后感
  5. 深究AngularJS——$sce的使用
  6. 银行核心海量数据无损迁移:TDSQL数据库多源异构迁移方案
  7. php表单写入数据库,php表单写入数据库
  8. Oracle中查询、禁用、启用、删除表外键
  9. 【HDU - 1455】Sticks (dfs + 剪枝)
  10. MySql数据库驱动类
  11. websocket python unity_Unity 连接WebSocket(ws://)服务器
  12. Flask+Mysql搭建网站之数据库问题
  13. CLR_via_C#.3rd 翻译[25.8 使用线程的理由]
  14. OpenStack基金会任命马振强为中国区大使
  15. 产品经理三大文档--BRD、MRD、PRD解读
  16. 基于ThinkPHP5+MySQL的超市进销存管理系统
  17. 密码学基础之对称密钥的分发和存储
  18. Win10右键菜单管理工具
  19. 阿里RocketMQ创始人首次分享出这份RocketMQ技术内木神级架构手册
  20. WordBias | 可视化文本中的偏见(刻板印象)

热门文章

  1. 无须买手机,在电脑上体验Android
  2. PLSQL的安装和配置
  3. ant-design-vue自定义使用阿里iconfont图标
  4. 软盘结构 磁头号和起始扇区的计算方法
  5. 【MySQL】mysql | 解决navicat连接mysql报错1129
  6. int main(int argc, char argv[]) argc和argv是什么意思?
  7. ai人工智能python_前5名:使用AI指导足球,Python登录指南等
  8. 如何让您的公司内容满足 GDPR 合规性
  9. GT/s和GB/s(Gbps)之间含义说明
  10. java Properties文件key-value值的读与写