有n个气球,编号为0到n-1,每个气球都有一个分数,存在nums数组中。每次吹气球i可以得到的分数为 nums[left] * nums[i] * nums[right],left和right分别表示i气球相邻的两个气球。当i气球被吹爆后,其左右两气球即为相邻。要求吹爆所有气球,得到最多的分数。

样例
给出 [4, 1, 5, 10]
返回 270

nums = [4, 1, 5, 10] burst 1, 得分 4 * 1 * 5 = 20
nums = [4, 5, 10] burst 5, 得分 4 * 5 * 10 = 200
nums = [4, 10] burst 4, 得分 1 * 4 * 10 = 40
nums = [10] burst 10, 得分 1 * 10 * 1 = 10
总共的分数为 20 + 200 + 40 + 10 = 270

动态规划。
首先按照题意,我们可以先在nums数组两端各加一个1,方便计算。
dp[i , j]表示吹爆第i个到第j个气球能获得的最多的分数。对于第i 到 第j个气球中,可以首先吹爆任意一个气球k(i<=k<=j),吹爆第k个气球时,能获得的分数为nums[k]* (此刻k的前一个数)* (此刻k的后一个数),但是由于并不知道之前k左边和右边的气球有没有被吹爆,所以不能确定此刻左右的数。换一种思路,既然可以首先吹爆任意一个气球k,那么也可以选择最后吹爆任意一个气球k。此时,k的左右数字就确定了,分别是nums[i-1]和nums[j+1]。

那么获得的分数就是nums[i-1]* nums[k]* nums[j+1],这是吹爆k获得的分数,再加上吹爆k之前获得的最大分数dp[i , k-1]+dp[k+1 , j](即在k之前吹爆的:k左边第i个到第k-1个,k右边第k+1个到第j个)。综上,dp[i , j]=max(nums[i-1]* nums[k]* nums[j+1] + dp[i , k-1]+ dp[k+1 , j]),(对于所有的 k : i<=k<=j).

显然,求dp[i , j]时,需要dp[i , k-1] , dp[k+1 , j],即区间长度小于i到j的区间长度的dp。所以可以从区间长度为1开始求解。这个和算法导论上动态规划那一章的矩阵链乘法类似,LintCode上另外一道题 Guess Number Game II也是这种按区间长度的增长来求解。

最后的结果为 dp[1 , n]。
代码如下:

class Solution(object):"""@param {int[]} nums a list of integer@return {int} an integer, maximum coins"""def maxCoins(self, nums):# Write your code heren=len(nums)nums.append(1)nums.insert(0,1)dp=[[0 for x in range(n+2)] for y in range(n+2)]for length in range(1,n+1):for i in range(1,n-length+2):j=i+length-1q=0for k in range(i,j+1):q=nums[i-1]*nums[k]*nums[j+1]+dp[i][k-1]+dp[k+1][j]if q>dp[i][j]:dp[i][j]=qreturn dp[1][n]

LintCode 吹气球相关推荐

  1. LintCode 249. 统计前面比自己小的数的个数

    给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000).对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量. 注意事项 We suggest ...

  2. LintCode: Max Tree

    题目 Given an integer array with no duplicates. A max tree building on this array is defined as follow ...

  3. 【LintCode: 3. 统计数字】算法题解析

    这是一道来自LintCode的算法题目,本文用C++来解答这道题,链接为: https://www.lintcode.com/problem/digit-counts/description 题目描述 ...

  4. LintCode 1.A+B的问题

    LintCode 1.A+B的问题 描述 给出两个整数 a 和 b , 求他们的和. 答案 public class Solution {/*** @param a: An integer* @par ...

  5. 关于爬楼梯的lintcode代码

    讲真的,这个我只会用递归去做,但是lintcode上面超时,所以只有在网上找了个动态规划的,虽然这个程序懂了,但是我觉得还是挺不容易的真正弄懂的话-- class Solution { public: ...

  6. lintcode: k Sum 解题报告

    K SUM My Submissions http://www.lintcode.com/en/problem/k-sum/ 题目来自九章算法 13% Accepted Given n distinc ...

  7. LintCode Longest Increasing Continuous Subsequence

    原题链接在这里:http://www.lintcode.com/en/problem/longest-increasing-continuous-subsequence/ 题目: Give an in ...

  8. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  9. leetcode 293.Flip Game(lintcode 914) 、294.Flip Game II(lintcode 913)

    914. Flip Game https://www.cnblogs.com/grandyang/p/5224896.html 从前到后遍历,遇到连续两个'+',就将两个加号变成'-'组成新的字符串加 ...

  10. LintCode 402: Continuous Subarray Sum

    LintCode 402: Continuous Subarray Sum 题目描述 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的下标 ...

最新文章

  1. web页,如何按回车获得焦点,触发web控件事件..?
  2. 万字长文 | 如何做好TO B产品?
  3. zigbee抗干扰matlab仿真,基于Zigbee的扩频通信MATLAB仿真.doc
  4. 【LeetCode - 227】基本计算器 II(栈)
  5. android 流量统计工具,Android 统计应用流量的使用情况
  6. ApacheCN 数据科学译文集 2020.8
  7. springmvc错误java.lang.IllegalArgumentException
  8. python selenium自动化获取oracle_Python+selenium2 自动化测试登录
  9. C/C++[codeup 1923]排序
  10. enym在此计算机运行是灰色,Win10重建引导记录mbr为灰色
  11. 【python】google的经纬度定位查询API
  12. echart图表去掉空白部分
  13. 微信小程序如何实现(点击发送弹幕)
  14. C/C++中生成随机序列——随机函数的选择和自我实现
  15. 解线性方程组的迭代法--大型稀疏矩阵---松弛迭代法C++实现
  16. DataSciComp 有关数据科学的比赛
  17. Olist巴西电商数据分析(二)
  18. 在线零售的未来看起来就是网红的带货直播
  19. linux系统查看主板cpu,Linux下使用lm_sensors查看主板和CPU温度
  20. LeetCode 546. 移除盒子 | Python

热门文章

  1. 罗素“杀死了”康托尔
  2. Android应用的persistent属性
  3. word根据标题自动生成目录
  4. matlab 一阶微分方程求解,一阶微分方程的matlab数值解法.doc
  5. fb2 android,FBReader PDF plugin app
  6. 爬虫(19)pipline补充+item的讲解+古诗文案例
  7. 基因重组-冲刺日志(第十天)
  8. bluetoothctl 工具的使用
  9. mysql--sql中双引号 单引号' 反单引号`的作用和区别
  10. Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped