312. 戳气球 Hard

有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i + 1] 枚硬币。 这里的 i - 1 和 i + 1 代表和 i 相邻的两个气球的序号。如果 i - 1或 i + 1 超出了数组的边界,那么就当它是一个数字为 1 的气球。

求所能获得硬币的最大数量。

示例 1:

输入:nums = [3,1,5,8]
输出:167
解释:
nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
coins =  3*1*5    +   3*5*8   +  1*3*8  + 1*8*1 = 167

示例 2:

输入:nums = [1,5]
输出:10

提示:

 ·n == nums.length

 ·1 <= n <= 300

 ·0 <= nums[i] <= 100

题目大意:在戳破一个气球可获得该气球与周围气球乘积数的情况下计算最多可获得的乘积数。

分析:

(1)在戳破一个气球后会造成不相邻的气球变得相邻,较难处理,因此考虑反向操作。将题目过程改为从两个数字为1的气球中不断插入气球,每次插入可获得插入球与相邻球的乘积数,计算最多可获得的乘积数;

(2)通过(1)中方法将问题转换为插入气球的问题,由于是从两个数字为1的气球开始插入,因此在nums数组的首尾插入数字1,再设dp[l][r]为在区间(l,r)中的气球全部插满最多可获得的硬币数。若区间(l,r)中第一个气球插入的位置为mid(l<mid<r),则dp[l][r]=dp[l][mid]+dp[mid][r]+nums[l]*nums[mid]*nums[r]。由此计算方式可得状态转移方程:

class Solution {
public:
    int maxCoins(vector<int>& nums) {
        nums.insert(nums.begin(),1);
        nums.emplace_back(1);
        int N=nums.size();
        vector<vector<int>> dp(N,vector<int>(N,0));
        for(int len=2,l,r,mid;len<N;++len){
            for(l=0,r=l+len;r<N;++l,++r){
                for(mid=l+1;mid<r;++mid){
                    dp[l][r]=max(dp[l][r],dp[l][mid]+dp[mid][r]+nums[l]*nums[mid]*nums[r]);
                }
            }
        }
        return dp[0][N-1];
    }
};

相关推荐

  1. LeetCode-day07-312. 气球

    2024-06-13 08:58:04       26 阅读
  2. 困难 Leetcode 312. 气球 区间dp/记忆化搜索

    2024-06-13 08:58:04       35 阅读
  3. 13 递归求解气球

    2024-06-13 08:58:04       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-13 08:58:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-13 08:58:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-13 08:58:04       82 阅读
  4. Python语言-面向对象

    2024-06-13 08:58:04       91 阅读

热门阅读

  1. 常用Object的方法

    2024-06-13 08:58:04       22 阅读
  2. (32)ADC接口--->(007)FPGA实现AD7606接口

    2024-06-13 08:58:04       32 阅读
  3. vim 显示行号

    2024-06-13 08:58:04       23 阅读
  4. 短剧app系统开发(对接广告联盟)源码搭建

    2024-06-13 08:58:04       32 阅读
  5. 加密算法:RSA非对称加密算法

    2024-06-13 08:58:04       24 阅读
  6. 【HTML】格式化文本 pre 标签

    2024-06-13 08:58:04       19 阅读
  7. Kafka 之 KRaft —— ZooKeeper 到 KRaft 的迁移

    2024-06-13 08:58:04       28 阅读
  8. k-means聚类模型的优缺点

    2024-06-13 08:58:04       29 阅读
  9. MATLAB神经网络---regressionLayer回归输出层

    2024-06-13 08:58:04       40 阅读
  10. 设计模式之观察者模式

    2024-06-13 08:58:04       34 阅读
  11. TensorFlow 1.x 版本保存模型的三种方式的优缺点

    2024-06-13 08:58:04       31 阅读