lintcode(168)吹气球
Description:
有n个气球,编号为0
到n-1
,每个气球都有一个分数,存在nums
数组中。每次吹气球i可以得到的分数为 nums[left] * nums[i] * nums[right]
,left和right分别表示i
气球相邻的两个气球。当i气球被吹爆后,其左右两气球即为相邻。要求吹爆所有气球,得到最多的分数。
Explanation:
给出 [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
Solution;
Dynamic programming. dp[start][end] 表示从start到end的最大分数。当mid气球吹爆的时候,left和right变成相邻的气球,此时如果将mid吹爆再切割,则不方便转移,那么就以mid为分割点,先吹爆两侧的气球。mid最后吹爆,所以midScore=(start-1)*mid*(end+1)。直至切分到start和end相等时,化简成三个气球的最小组合,吹爆当前气球。
dp的四要素:
Definition:
dp[i][j]表示吹爆i到j之间的气球所能得到的最大分数
Function:
dp[i][j] = max(dp[i][k-1] + score(k) + dp[k+1][j]) 对于所有k属于{i,j}
Intialize:
dp[i][j] = 0 for each i&j.
Answer:
dp[1][n]
public class Solution {/*** @param nums a list of integer* @return an integer, maximum coins*/public int maxCoins(int[] nums) {// Write your code hereint len = nums.length;int[][] dp = new int[len+2][len+2];int[][] visit = new int[len+2][len+2];int[] numsPlus = new int[len+2];for(int i = 1;i<len + 1;i++){numsPlus[i] = nums[i - 1];}numsPlus[0] = 1;numsPlus[len+1] = 1;int result = search(dp , visit , numsPlus , 1 , len);return result;}public int search(int[][] dp , int[][] visit , int[] numsPlus , int start , int end){if(visit[start][end] == 1){return dp[start][end];}int res = 0;for(int i = start ; i<=end ; i++){int mid = numsPlus[start-1]*numsPlus[i]*numsPlus[end+1];int right = search(dp , visit , numsPlus , start , i - 1);int left = search(dp , visit , numsPlus , i + 1 , end);res = Math.max(res , mid + right + left);}visit[start][end] = 1;dp[start][end] = res;return res;}
}
lintcode(168)吹气球相关推荐
- LintCode 249. 统计前面比自己小的数的个数
给定一个整数数组(下标由 0 到 n-1, n 表示数组的规模,取值范围由 0 到10000).对于数组中的每个 ai 元素,请计算 ai 前的数中比它小的元素的数量. 注意事项 We suggest ...
- scala报错20/08/31 23:48:40 WARN TaskSetManager: Lost task 1.0 in stage 0.0 (TID 1, 192.168.28.94, exec
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- deepin10.15安装cuda10.1.168 cudnn7.6.1 tensorflow_gpu1.4.0
deepin10.15安装cuda10.1.168 cudnn7.6.1 tensorflow_gpu1.4.0 最近入坑deepin操作系统,基于debian9,和Ubuntu具有一样的操作习惯,由 ...
- 品牌故事第11期之IBM:连亏168亿都逆袭,蓝色巨人的百年兴衰史
https://www.toutiao.com/a6700496808159740424/ 追溯品牌历史,挖掘科技背后故事,大家好,这里是每周日准时与大家见面的品牌故事,我是各位的老朋友游戏日报阿野. ...
- 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 题目描述 ...
- 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?...
代码: package com.liron.p1; /*** 一个整数,它加上100后是一个完全平方数,再加上168又是* 一个完全平方数,请问该数是多少?* */ public class Topi ...
- Forbid consumer 192.168.85.1 access service com.sharearn.dubbo.romote.TestService from registry
为什么80%的码农都做不了架构师?>>> com.alibaba.dubbo.rpc.RpcException:Forbid consumer192.168.85.1 a ...
- ssh: connect to host 192.168.57.131 port 22: Conne
为什么80%的码农都做不了架构师?>>> 文档背景: 重新克隆了一台centos机器,由于时间太久,已经忘了之前Xshell远程连接是如何配置的了.只记得,需要关闭防火墙.现将 ...
- 路由器管理页面html,196.168.1.1登陆页面网址
196.168.1.1手机怎么登陆? 解决方法如下: 1.路由器设置网址是192.168.1.1,而非196.168.1.1,故此无法登陆原因是网址输入错误. 2.在手机端浏览器输入网址192.168 ...
最新文章
- nginx php-fpm 运行原理
- jsonp数据库拿数据到html页面,前端如何优雅的使用jsonp获取接口数据
- Hibernate中基本概念
- Day11多态部分-6 【1.3 对象的向上转型和向下转型】
- from mysql_MySQL的FROM
- Android插件化开发之动态加载技术系列索引
- 微服务网关Gateway
- java学习(142):file类的基本创建
- Oracle常用的几个父栓
- nagios监控mysql服务_nagios监控mysql及邮件报警
- [SOA] Mule ESB 3.x 入门(二)—— 配置(spring, properties, log4j)
- linux C++ socket编程 实例
- PopClip翻译插件开发记录-microsoft_translate.popclipext
- aspectjweaver的作用
- dSYM文件的汇编分析
- 按关键字采集淘特商品列表API接口H5
- cf1677C. Tokitsukaze and Two Colorful Tapes(div1)
- 燕麦云何洋开讲丨真假海盗?黑客杠上好莱坞,还要把电影变成现实
- 如何提高条形码识别率
- ES搜索结果中各个字段介绍,hits,took,timeout
热门文章
- 网络加密流量的相关研究
- python爬虫qq音乐歌词_Python如何爬取qq音乐歌词到本地
- 卸载一个游戏计算机里还有文件,如何处理pc游戏卸载后留下的残余文件?
- 常见的计算机音频缩写,音响系统常见英文缩写,你知道几个?
- 依赖注入:语法糖胜于功能组合
- 人工智能在计算机领域的应用论文,人工智能应用领域论文 关于人工智能领域的大学论文...
- 高等数学考研笔记(九)
- c语言瑞年条件,C语言如何判断是闰年,闰年判断条件
- 零基础入门前端工程师必备书籍推荐
- python自动图片拼接——基于Pillow和os