zoukankan      html  css  js  c++  java
  • 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];
        }
    };
    
  • 相关阅读:
    引用的难点:函数返回值是引用(引用当左值)
    引用的意义与本质
    引用做函数参数
    Uva
    Uva
    Uva
    暑假集训-8.06总结
    暑假集训-8.05总结
    CH1801( 括号画家)
    最大异或对
  • 原文地址:https://www.cnblogs.com/casperwin/p/13785436.html
Copyright © 2011-2022 走看看