这个题我觉得真的挺难的吧。属于区间DP类型的题。看了区间DP(堆石子)后觉得这题也不是区间DP啊。比如我选择了第k个气球,但是不一定就分成了两半啊,k-1和k+1就相连了啊。后来才发觉是有最优子结构性质的。考虑最后一个被吹破的气球,它就将气球阵列分成了两半!
DP[i][j]=max(DP[i][k]+DP[k][j]+nums[i−1]∗nums[k]∗nums[j+1])
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(nums.size(), vector<int>(nums.size(), 0));
for (int len = 1; len <= n; ++len)
for (int left = 1; left <= n - len + 1; ++left) {
int right = left + len - 1;
for (int k = left; k <= right; ++k)
dp[left][right] = max(dp[left][right], nums[left-1]*nums[k]*nums[right+1] + dp[left][k-1] + dp[k+1][right]);
}
return dp[1][n];
}
};