Burst Balloons

hard array dp

Problem

Each balloon has a value. Bursting balloon i earns nums[left] · nums[i] · nums[right] coins, where left/right are the neighbours still standing. Return the maximum coins obtainable by bursting all balloons.

Inputnums = [3, 1, 5, 8]
Output167

def max_coins(nums):
    a = [1] + nums + [1]
    n = len(a)
    dp = [[0]*n for _ in range(n)]
    for length in range(2, n):
        for i in range(n - length):
            j = i + length
            for k in range(i + 1, j):
                dp[i][j] = max(dp[i][j], dp[i][k] + a[i]*a[k]*a[j] + dp[k][j])
    return dp[0][n - 1]
function maxCoins(nums) {
  const a = [1, ...nums, 1];
  const n = a.length;
  const dp = Array.from({ length: n }, () => new Array(n).fill(0));
  for (let len = 2; len < n; len++) {
    for (let i = 0; i + len < n; i++) {
      const j = i + len;
      for (let k = i + 1; k < j; k++) {
        dp[i][j] = Math.max(dp[i][j], dp[i][k] + a[i] * a[k] * a[j] + dp[k][j]);
      }
    }
  }
  return dp[0][n - 1];
}
class Solution {
    public int maxCoins(int[] nums) {
        int m = nums.length;
        int n = m + 2;
        int[] a = new int[n];
        a[0] = a[n-1] = 1;
        for (int i = 0; i < m; i++) a[i+1] = nums[i];
        int[][] dp = new int[n][n];
        for (int len = 2; len < n; len++)
            for (int i = 0; i + len < n; i++) {
                int j = i + len;
                for (int k = i + 1; k < j; k++)
                    dp[i][j] = Math.max(dp[i][j], dp[i][k] + a[i]*a[k]*a[j] + dp[k][j]);
            }
        return dp[0][n - 1];
    }
}
int maxCoins(vector<int>& nums) {
    int m = nums.size(), n = m + 2;
    vector<int> a(n, 1);
    for (int i = 0; i < m; i++) a[i + 1] = nums[i];
    vector<vector<int>> dp(n, vector<int>(n, 0));
    for (int len = 2; len < n; len++)
        for (int i = 0; i + len < n; i++) {
            int j = i + len;
            for (int k = i + 1; k < j; k++)
                dp[i][j] = max(dp[i][j], dp[i][k] + a[i]*a[k]*a[j] + dp[k][j]);
        }
    return dp[0][n - 1];
}
Time: O(n³) Space: O(n²)