312. Burst Balloons
You are given n
balloons, indexed from 0
to n - 1
. Each balloon is painted with a number on it represented by an array nums
. You are asked to burst all the balloons.
If you burst the ith
balloon, you will get nums[i - 1] * nums[i] * nums[i + 1]
coins. If i - 1
or i + 1
goes out of bounds of the array, then treat it as if there is a balloon with a 1
painted on it.
Return the maximum coins you can collect by bursting the balloons wisely.
Example 1:
Input: nums = [3,1,5,8] Output: 167 Explanation: 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
Example 2:
Input: nums = [1,5] Output: 10
Constraints:
n == nums.length
1 <= n <= 500
0 <= nums[i] <= 100
Rust Solution
struct Solution;
impl Solution {
fn max_coins(nums: Vec<i32>) -> i32 {
let n = nums.len();
let mut new_nums = vec![1; n + 2];
new_nums[1..n + 1].clone_from_slice(&nums);
let n = new_nums.len();
let mut memo: Vec<Vec<i32>> = vec![vec![0; n]; n];
Self::dp(0, n - 1, &mut memo, &new_nums)
}
fn dp(l: usize, r: usize, memo: &mut Vec<Vec<i32>>, nums: &[i32]) -> i32 {
if l + 1 == r {
return 0;
}
if memo[l][r] != 0 {
return memo[l][r];
}
let mut res = 0;
for i in l + 1..r {
let sum = nums[l] * nums[i] * nums[r]
+ Self::dp(l, i, memo, nums)
+ Self::dp(i, r, memo, nums);
res = res.max(sum);
}
memo[l][r] = res;
res
}
}
#[test]
fn test() {
let nums = vec![3, 1, 5, 8];
let res = 167;
assert_eq!(Solution::max_coins(nums), res);
}
Having problems with this solution? Click here to submit an issue on github.