LeetCode-day07-312. 戳气球

LeetCode-day07-312. 戳气球

题目描述

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

现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 numsi - 1 * numsi * numsi + 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 = 31 5 + 35 8 + 13 8 + 181 = 167

示例2:

输入:nums = 1,5

输出:10

思路

采用区间动态规划求解。本质是求最值,并且注意边界问题。

flr=max(flk+fkr+arrl×arrk×arrr),k∈(l,r)

代码

java 复制代码
 public static int maxCoins(int[] nums) {
        int n = nums.length;
        int[] newNums = new int[n + 2];
        newNums[0] = 1;
        newNums[n + 1] = 1;
        for (int i = 0; i < n; i++) {
            newNums[i + 1] = nums[i];
        }

        int[][] dp = new int[n + 2][n + 2];

        for (int length = 2; length < n + 2; length++) {
            for (int left = 0; left < n + 2 - length; left++) {
                int right = left + length;
                for (int k = left + 1; k < right; k++) {
                    dp[left][right] = Math.max(dp[left][right], 
                                               dp[left][k] + dp[k][right] + newNums[left] * newNums[k] * newNums[right]);
                }
            }
        }

        return dp[0][n + 1];
    }
相关推荐
容器魔方16 小时前
KubeEdge SIG AI: 基于KubeEdge-Ianvs的大模型联邦微调算法
大数据·人工智能·算法·云原生·容器·云计算
Demon1_Coder16 小时前
智能体的自定义工具
java·linux·前端
原创小甜甜16 小时前
OOM 排查复盘:Hutool 序列化 Request 导致 Java Heap Space
java·开发语言·python
列星随旋16 小时前
矩阵快速幂
java·算法·矩阵
闪电悠米16 小时前
黑马点评-分布式锁-02_simple_redis_lock_setnx
java·数据库·spring boot·redis·分布式·缓存·wpf
z2005093016 小时前
今日算法(回溯全排列)
c++·算法·leetcode
Boom_Shu16 小时前
构造函数程序
数据结构·算法
萨小耶16 小时前
[Java学习日记10】聊聊checked exception和runtime exception
java·开发语言·学习
超梦dasgg16 小时前
IDEA(IntelliJ IDEA)超详细基础使用教程
java·ide·intellij-idea
MicroTech202516 小时前
微算法科技(NASDAQ: MLGO)量子安全与区块链:量子神经网络QNN赋能动态共识与量子密钥分发
科技·算法·安全