LeetCode 312. Burst Balloons
一看就是DP题,但是递推公式比较难想。为了简化问题,给 nums 开始和最后都加上1。
记 dp[i][j] 表示 nums[i~j] 能得到的最大coin。
k 表示保留着的气球,
dp[i][j] = max_k { dp[i][k-1] + nums[i-1] * nums[k] * nums[j+1] + dp[k+1][j] } i<=k<=j
dp 需要从小到大构建,以 {1,1,2,3,1} 为例,dp[1][1], dp[2][2], dp[3][3], 然后再 dp[1][2], dp[2][3],最后dp[1][3]
类似从小到大构建的,常规方法是用一个变量l,然后枚举i,用i和l计算出j,最后枚举k。
class Solution { public: int maxCoins(vector<int>& nums) { int n=nums.size(); nums.insert(nums.begin(),1); nums.push_back(1); // dp[i][j] - max coins from nums[i~j] vector<vector<int>> dp(n+2,vector<int>(n+2,0)); for (int l=0;l<n;++l){ for (int i=1;i<=n-l;++i){ int j=i+l; 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]; } };

浙公网安备 33010602011771号