30 Day Challenge Day 21 | Leetcode 312. Burst Balloons
题解
Hard
动态规划
这道题还确实挺难的,尤其是状态转移方程,不容易想到。
dp[i][j]: i位到j位的子数组能得到的最大值(或最多硬币值)。
这个问题可以继续分解乘子问题:
| i | ... | k | ... | j | (k = i ... j)
考虑如果第k位是[i, j]中最后戳破的气球,那么子问题是 dp[i][k-1] 和 dp[k+1][j].
class Solution {
public:
int maxCoins(vector<int>& nums) {
int n = nums.size();
nums.insert(nums.begin(), 1);
nums.push_back(1);
vector<vector<int>> dp(n+2, vector<int>(n+2));
for(int l = 1; l <= n; l++) {
for(int i = 1; i <= n-l+1; i++) {
int j = i + l - 1;
for(int k = i; k <= j; k++) {
dp[i][j] = max(dp[i][j], dp[i][k-1] + nums[i-1]*nums[k]*nums[j+1] + dp[k+1][j]);
}
}
}
return dp[1][n];
}
};