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];
        }
    };
    
  • 相关阅读:
    bfs,队列
    Wannafly挑战赛22 A计数器(裴蜀定理 gcd)
    素数筛模板
    HDU
    HDU
    控制精度-----直接截取,不需四舍五入
    jstl下载与配置
    B. Treasure Hunt
    动态数组vector
    Manacher算法
  • 原文地址:https://www.cnblogs.com/casperwin/p/13785436.html
Copyright © 2011-2022 走看看