312. Burst Balloons
Input: [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// Top-Down Recursive DP with Memoization
int helper(vector<int>& nums, vector<vector<int> >& memo, int i, int j) {
if (i > j) return 0;
if (memo[i][j] > 0) return memo[i][j];
int res = 0;
for (int k = i; k <= j; ++k) {
res = max(res, nums[i - 1] * nums[k] * nums[j + 1] + helper(nums, memo, i, k - 1) + helper(nums, memo, k + 1, j));
}
return memo[i][j] = res;
}
int maxCoins(vector<int>& nums) { // time: O(n^3); space: O(n^2)
int n = nums.size();
nums.insert(nums.begin(), 1);
nums.push_back(1);
vector<vector<int> > memo(n + 2, vector<int>(n + 2, 0));
return helper(nums, memo, 1, n);
}Last updated