[LeetCode] Burst Ballons
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
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
Denote dp[i][j] the maximum coins we collect by bursting ballons i~j (0 <= i <= j < n) , then the state transition function is:
dp[i][j] = max { dp[i][k-1] + score(k) + dp[k+1][j] } for k in range [i, j]
score[k] = nums[i-1] * nums[k] * nums[j+1]
Innitialization: for any i and j , dp[i][j] = 0
Time Complexity: O(n^3), Space Complexity: O(n^2)
Sample Code in Golang
burst_ballons.go
package burst_ballons func MaxCoins(nums []int) int { n := len(nums) ar := make([]int, n + 2) for i := 1; i <= n; i++ { ar[i] = nums[i - 1] } ar[0], ar[n + 1] = 1, 1 dp := make([][]int, n + 2) for i := 0; i < n + 2; i++ { dp[i] = make([]int, n + 2) } max := func(x, y int) int { if x > y { return x } return y } for i := n; i > 0; i-- { for j := i; j < n + 1; j++ { for k := i; k <= j; k++ { scr := ar[i - 1] * ar[k] * ar[j + 1] tmp := dp[i][k - 1] + scr + dp[k + 1][j] dp[i][j] = max(dp[i][j], tmp) } } } return dp[1][n] }
burst_ballons_test.go
package burst_ballons import "testing" func check_answer(t *testing.T, v1, v2 int) { if v1 != v2 { t.Fatalf("wrong answer %d, expected %d", v1, v2) } } func TestMaxCoins(t *testing.T) { nums := []int{} n := MaxCoins(nums) check_answer(t, n, 0) nums = []int{5} n = MaxCoins(nums) check_answer(t, n, 5) nums = []int{3, 5, 8} n = MaxCoins(nums) check_answer(t, n, 152) nums = []int{3, 1, 5, 8} n = MaxCoins(nums) check_answer(t, n, 167) }