LintCode 吹气球
有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 吹气球相关推荐
- LintCode 249. 统计前面比自己小的数的个数
给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000).对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量. 注意事项 We suggest ...
- LintCode: Max Tree
题目 Given an integer array with no duplicates. A max tree building on this array is defined as follow ...
- 【LintCode: 3. 统计数字】算法题解析
这是一道来自LintCode的算法题目,本文用C++来解答这道题,链接为: https://www.lintcode.com/problem/digit-counts/description 题目描述 ...
- LintCode 1.A+B的问题
LintCode 1.A+B的问题 描述 给出两个整数 a 和 b , 求他们的和. 答案 public class Solution {/*** @param a: An integer* @par ...
- 关于爬楼梯的lintcode代码
讲真的,这个我只会用递归去做,但是lintcode上面超时,所以只有在网上找了个动态规划的,虽然这个程序懂了,但是我觉得还是挺不容易的真正弄懂的话-- class Solution { public: ...
- lintcode: k Sum 解题报告
K SUM My Submissions http://www.lintcode.com/en/problem/k-sum/ 题目来自九章算法 13% Accepted Given n distinc ...
- LintCode Longest Increasing Continuous Subsequence
原题链接在这里:http://www.lintcode.com/en/problem/longest-increasing-continuous-subsequence/ 题目: Give an in ...
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
- leetcode 293.Flip Game(lintcode 914) 、294.Flip Game II(lintcode 913)
914. Flip Game https://www.cnblogs.com/grandyang/p/5224896.html 从前到后遍历,遇到连续两个'+',就将两个加号变成'-'组成新的字符串加 ...
- LintCode 402: Continuous Subarray Sum
LintCode 402: Continuous Subarray Sum 题目描述 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的下标 ...
最新文章
- web页,如何按回车获得焦点,触发web控件事件..?
- 万字长文 | 如何做好TO B产品?
- zigbee抗干扰matlab仿真,基于Zigbee的扩频通信MATLAB仿真.doc
- 【LeetCode - 227】基本计算器 II(栈)
- android 流量统计工具,Android 统计应用流量的使用情况
- ApacheCN 数据科学译文集 2020.8
- springmvc错误java.lang.IllegalArgumentException
- python selenium自动化获取oracle_Python+selenium2 自动化测试登录
- C/C++[codeup 1923]排序
- enym在此计算机运行是灰色,Win10重建引导记录mbr为灰色
- 【python】google的经纬度定位查询API
- echart图表去掉空白部分
- 微信小程序如何实现(点击发送弹幕)
- C/C++中生成随机序列——随机函数的选择和自我实现
- 解线性方程组的迭代法--大型稀疏矩阵---松弛迭代法C++实现
- DataSciComp 有关数据科学的比赛
- Olist巴西电商数据分析(二)
- 在线零售的未来看起来就是网红的带货直播
- linux系统查看主板cpu,Linux下使用lm_sensors查看主板和CPU温度
- LeetCode 546. 移除盒子 | Python
热门文章
- 罗素“杀死了”康托尔
- Android应用的persistent属性
- word根据标题自动生成目录
- matlab 一阶微分方程求解,一阶微分方程的matlab数值解法.doc
- fb2 android,FBReader PDF plugin app
- 爬虫(19)pipline补充+item的讲解+古诗文案例
- 基因重组-冲刺日志(第十天)
- bluetoothctl 工具的使用
- mysql--sql中双引号 单引号' 反单引号`的作用和区别
- Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped