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];
    }
};

 

posted @ 2019-07-14 16:03  約束の空  阅读(86)  评论(0)    收藏  举报