leetcode Burst Balloons

leetcode Burst Balloons

Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins. Here left and right are adjacent indices of i. After the burst, the left and right then becomes adjacent.

Find the maximum coins you can collect by bursting the balloons wisely.

Note:
(1) You may imagine nums[-1] = nums[n] = 1. They are not real therefore you can not burst them.
(2) 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

Example:

Given [3, 1, 5, 8]

Return 167

题目地址: leetcode Burst Balloons

题意:

给定n个气球。每次你可以打破一个,打破第i个,那么你会获得nums[left] * nums[i] * nums[right]个积分。 (nums[-1] = nums[n] = 1)求你可以获得的最大积分数

思路:

一开始想dp[i][j] 为第 i 天打破第j 个气球,然后枚举上一轮打破的为第k个气球 dp[i][j] =max( dp[i – 1][k] + left * nums[j] * right) (当然要记录都打了哪些O) 复杂度 O(n^3) 然而TLE (python)

看了discuss是dp[i][j]为打破的气球为i~j之间。

我们可以想象:最后的剩下一个气球为i的时候,可以获得的分数为:nums[-1]*nums[i]*nums[n].

那么介于i,j之间的x,有: dp[i][j] = max(dp[i][j], dp[i][x – 1] + nums[i – 1] * nums[x] * nums[j + 1] + dp[x + 1][j]);

这里,为了方便代码书写,我在首尾插入了两个1,所以答案是 dp[1][n] (n为原来的长度)

可以用记忆化搜索也可以直接迭代DP,当然,记忆化搜索更好理解一点。

 

Divide and Conquer 记忆化搜索

Java 18ms

C++ 76ms

Python 1100ms

 

DP

C++跑1330MS  ,JAVA 187MS ,python TLE 。。。。python TLE 可以理解,但C++比JAVA这题还慢这不合理。。。。可能是vector太慢?

  • update at 2015.12.22 :重新提交发现跑快了,目测为了照顾python 把数据量降下来了

Java 15ms

 

C++ 36ms

 

 

 

本博客若无特殊说明则由 hrwhisper 原创发布
转载请点名出处:细语呢喃 > leetcode Burst Balloons
本文地址:https://www.hrwhisper.me/leetcode-burst-balloons/

您的支持将鼓励我继续创作!

Leetcode , , . permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *