思路:区间DP,枚举的点就是最后戳破的那颗汽球,然后左右区间递归,可以化成迭代的形式三层for。注意根据题目的要求要做第一个和最后一个的预处理,复杂度:
O
(
n
3
)
O(n^3)
O(n3)。由于那个cost不满足四边形不等式的要求(不单调),所以不能优化下一个n
class Solution {
public:
int maxCoins(vector<int>& V) {
V.insert(V.begin(), 1, 1);
V.push_back(1);
int n = V.size();
vector<vector<int>> dp(n+1, vector<int>(n+1, 0));
return DP(dp, 1, n-2, V);
}
//[l...r]区间的最大分数,枚举区间的最后一个汽球
int DP(vector<vector<int>>& dp, int l, int r, vector<int>& nums) {
int& ans=dp[l][r];
if(l>r) return 0;
if(ans) return ans;
for(int k=l; k<=r; k++) ans=max(ans, DP(dp, l, k-1, nums)+DP(dp, k+1, r, nums)+nums[l-1]*nums[r+1]*nums[k]); //枚举最后一个汽球
return ans;
}
};