思路: 定义dp[i][j]为戳破i到j之间的气球获得的最大硬币数量,假设最后一个戳破的气球为k,则状态转移为dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+nums[i]*nums[j]*nums[k]),最后返回dp[0][n+1]
class Solution {
public:
int maxCoins(vector<int>& nums) {
int n=nums.size();
vector<int>arr(n+2);
arr[0]=arr[n+1]=1;
for(int i=1;i<=n;i++){
arr[i]=nums[i-1];
}
vector<vector<int>>dp(n+2,vector<int>(n+2,0));
for(int i=n+1;i>=0;i--){
for(int j=i+1;j<=n+1;j++){
for(int k=i+1;k<j;k++){
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+arr[i]*arr[j]*arr[k]);
}
}
}
return dp[0][n+1];
}
};