Burst Balloons — Interval DP

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem

Array of balloons. Bursting balloon i gives nums[i-1]*nums[i]*nums[i+1]. Maximize total coins.


Key Insight — Last Balloon in Interval

Instead of thinking which to burst first (hard), think which to burst last in interval [i,j]. The last balloon k is surrounded by i-1 and j+1 (already burst).

dp[i][j] = max over k: dp[i][k-1] + nums[i-1]*nums[k]*nums[j+1] + dp[k+1][j]

Time: O(n³) | Space: O(n²)


Solutions

Python

class Solution:
    def maxCoins(self, nums: list[int]) -> int:
        nums=[1]+nums+[1]; n=len(nums)
        dp=[[0]*n for _ in range(n)]
        for length in range(2,n):
            for i in range(0,n-length):
                j=i+length
                for k in range(i+1,j):
                    dp[i][j]=max(dp[i][j], dp[i][k]+nums[i]*nums[k]*nums[j]+dp[k][j])
        return dp[0][n-1]

C++

class Solution {
public:
    int maxCoins(vector<int>& nums){
        nums.insert(nums.begin(),1); nums.push_back(1);
        int n=nums.size();
        vector<vector<int>> dp(n,vector<int>(n,0));
        for(int len=2;len<n;len++)
            for(int i=0;i<n-len;i++){
                int j=i+len;
                for(int k=i+1;k<j;k++)
                    dp[i][j]=max(dp[i][j],dp[i][k]+nums[i]*nums[k]*nums[j]+dp[k][j]);
            }
        return dp[0][n-1];
    }
};

Complexity

  • Time: O(n³) | Space: O(n²)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro