以两个数作为左右端点,找出最优解中它们中间那个戳破的气球,中间这个气球把整个队列分为了2部分,要想让中间这个气球和2个端点靠在一起,就需要先把分开的2部分的气球戳破。
dp[i][j]表示i~j最大值,i,j不戳破。 比如k气球在i,j之间时(i,k,j)被戳破,那么要先戳破i,k、k,j之间的气球,所以dp[i][j]=dp[i][k]+dp[k][j]+nums[i]*nums[k]*nums[j]
class Solution {
public:
// dp[l][r]:不戳破l、r,戳破(l,r)之间所有气球,能获得的最大金币
int maxCoins(vector<int>& nums) {
nums.insert(nums.begin(), 1);
nums.emplace_back(1);
int n = nums.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
for(int len = 3; len <= n; len++){
for(int l = 0; l <= n - len; l++){
int r = l + len - 1;
for(int mid = l + 1; mid < r; mid++){
dp[l][r] = max(dp[l][mid] + dp[mid][r] + nums[l] * nums[mid] * nums[r], dp[l][r]);
}
}
}
return dp[0][n - 1];
}
};