思路:
逆向思维,一个一个移除气球不好处理,改为一个一个增加气球,就可以使用区间dp计算了。
实现:
1 class Solution { 2 public: 3 int maxCoins(vector<int>& nums) { 4 int n=nums.size(); 5 vector<int>a(n+2,1); 6 for(int i=0;i<n;i++){ 7 a[i+1]=nums[i]; 8 } 9 vector<vector<int>>dp(n+2,vector<int>(n+2,0)); 10 for(int i=n+1;i>=0;i--){ 11 if(i+2<=n+1)dp[i][i+2]=a[i]*a[i+1]*a[i+2]; 12 for(int j=i+3;j<=n+1;j++){ 13 for(int k=i+1;k<j;k++){ 14 dp[i][j]=max(dp[i][j],dp[i][k]+a[k]*a[i]*a[j]+dp[k][j]); 15 } 16 } 17 } 18 return dp[0][n+1]; 19 } 20 };