<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 {
    int helper(vector<int>&nums,int left,int right)
    {
        if(right-left==1)return 0;
        
        int maxAmount=INT_MIN;
        for(int i=left+1;i<right;i++)
        {
            int amount=helper(nums,i,right)+helper(nums,left,i)+nums[i]*nums[left]*nums[right];
            maxAmount=max(maxAmount,amount);
        }
        return maxAmount;
    }
public:
    int maxCoins(vector<int>& nums) {
      nums.push_back(1);
      nums.insert(nums.begin(),1);
      int n=nums.size();
     // return helper(nums,0,n-1);

      vector<vector<int>>dp(n,vector<int>(n,0));
      for(int left=n-1;left>=0;left--)
      {
        for(int right=0;right<n;right++)
        {
            if(right-left==1)
            {
                dp[left][right]=0;
                continue;
            }
        
            int maxAmount=INT_MIN;
            for(int i=left+1;i<right;i++)
            {
                int amount=dp[i][right]+dp[left][i]+nums[i]*nums[left]*nums[right];
               // int amount=helper(nums,i,right)+helper(nums,left,i)+nums[i]*nums[left]*nums[right];
                maxAmount=max(maxAmount,amount);
            }
            dp[left][right]= maxAmount;
        }
      }
      return dp[0][n-1];
         
    }
};
12300