240
笔下虽有千言,胸中实无一策

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];
    }
};
posted @ 2020-10-09 13:52  CasperWin  阅读(120)  评论(0编辑  收藏  举报