<p>You are given <code>n</code> balloons, indexed from <code>0</code> to <code>n - 1</code>. Each balloon is painted with a number on it represented by an array <code>nums</code>. You are asked to burst all the balloons.</p>

<p>If you burst the <code>i<sup>th</sup></code> balloon, you will get <code>nums[i - 1] * nums[i] * nums[i + 1]</code> coins. If <code>i - 1</code> or <code>i + 1</code> goes out of bounds of the array, then treat it as if there is a balloon with a <code>1</code> painted on it.</p>

<p>Return <em>the maximum coins you can collect by bursting the balloons wisely</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [3,1,5,8]
<strong>Output:</strong> 167
<strong>Explanation:</strong>
nums = [3,1,5,8] --&gt; [3,5,8] --&gt; [3,8] --&gt; [8] --&gt; []
coins =  3*1*5    +   3*5*8   +  1*3*8  + 1*8*1 = 167</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,5]
<strong>Output:</strong> 10
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>n == nums.length</code></li>
	<li><code>1 &lt;= n &lt;= 300</code></li>
	<li><code>0 &lt;= nums[i] &lt;= 100</code></li>
</ul>

class Solution {
public:
    int dp[501][501];
    int n;
    int solve(int i, int j,vector<int>&temp){
        //base condition
        if(i>j) return 0;
        if(i==j){
            int ans = temp[i];
            if(i>0) ans*=temp[i-1];
            if(i<n-1) ans*=temp[i+1];
            return ans;
        }
        if(dp[i][j]!=-1) return dp[i][j];
        int maxi=0;
        for(int k=i;k<=j;k++){
            int ans = temp[k];
            if(i>0) ans*= temp[i-1];
            if(j<n-1) ans*=temp[j+1];
            //to burst kth as last ballon
            maxi=max(maxi, ans + solve(i,k-1,temp) + solve(k+1,j,temp));
        }
        dp[i][j] = maxi;
        return dp[i][j];
    }
    int maxCoins(vector<int>& nums) {
        memset(dp,-1,sizeof(dp));
        //we will choose kth balloon to be the last one that we will burst.
        vector<int>temp;
        temp.push_back(1);
        for(auto i : nums){
            temp.push_back(i);
        }
        temp.push_back(1);
        n = temp.size();
        //function will return the maximum profit we will get after 
        //bursting the balloons from balloon 1 to balloon temp.size()-2
        return solve(1,temp.size()-2,temp);
    }
};
10900