首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

气球

问题描述: 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。...如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。...注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。 求所能获得硬币的最大数量。...若使用dfs+回溯依次选择一个气球扎破,枚举出所有可能的情况,很明显就是一个全排列问题,但是其复杂度为O(n!),n=500肯定是过不了的。...该问题需要换一种思路,从后往前算,对于该问题的解(一组扎气球的顺序)从后往前算和从前往后算值总是相同的,因此扎气球问题可以转化为吹气球问题,每次吹一个气球放到数组中,并且获得硬币。

1.1K30
您找到你想要的搜索结果了吗?
是的
没有找到

经典动态规划:气球问题

如何将我们的扎气球问题转化成回溯算法呢?这个应该不难想到的,我们其实就是想穷举气球的顺序,不同的气球顺序可能得到不同的分数,我们需要把所有可能的分数中最高的那个找出来,对吧。...所以对于这个气球问题,如果想用动态规划,必须巧妙地定义dp数组的含义,避免子问题产生相关性,才能推出合理的状态转移方程。 如何定义dp数组呢,这里需要对问题进行一个简单地转化。...那么我们可以改变问题:在一排气球points中,请你戳破气球0和气球n+1之间的所有气球(不包括0和n+1),使得最终只剩下气球0和气球n+1两个气球,最多能够得到多少分?...那么根据这个定义,题目要求的结果就是dp[0][n+1]的值,而 base case 就是dp[i][j] = 0,其中0 <= i <= n+1, j <= i+1,因为这种情况下,开区间(i, j)中间根本没有气球可以...由于是开区间,dp[i][k]和dp[k][j]不会影响气球k;而戳破气球k时,旁边相邻的就是气球i和气球j了,最后还会剩下气球i和气球j,这也恰好满足了dp数组开区间的定义。

80510

每日算法系列【LeetCode 312】气球

题目描述 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。...每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。...注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。 求所能获得硬币的最大数量。...0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100 题解 dfs+记忆化搜索 对于区间 [l, r] ,我们考虑最后一个被戳破的气球 k ,那么之前的步骤我们可以分为两步,也就是求 [l, k...有一个小技巧就是,提示里也说了,就是刚开始的时候在首尾各添加一个分数为 1 的虚拟气球。 但是直接这样递归会超时,因为有很多的子状态都重复计算了,所以可以用一个全局的数组保存每个状态的分数。

58720

气球(反向思维+区间动态规划)

显然,如果是按照先戳破第k个气球来思考,子问题之间是相互依赖的,问题只能分解,不能将小问题的解正确的合成。所以我们要做的是如何分解可以使得小问题之间相互独立?...想要子问题相互独立,子问题要依赖的量最好是固定值,不能是变量(比如先戳破第k个气球,则k右边的气球依赖的相邻左边气球会发生变化)。那从问题中,什么是固定值呢?...既然相邻两侧是变量,那边界就是固定值,不论怎么戳破区间内的气球,区间左右边界的气球不变,因此,我们可以从边界下手 那什么情况下戳破第k个气球会需要边界i, j的气球呢?...有了以上铺垫,就可以直接上手动态规划套路了 【状态】:拿到的累计钱币数(由于没有已知上限,不适合做为dp索引) 【选择】:从(i, j)中选择索引k的气球戳破,拿到对应钱币 【dp函数含义】:开区间(i..., j)内戳破气球获得的最大硬币数量dp[i][j] 【初始化】:在气球对应的硬币数量数组收尾添加1,其余照抄原数组 【状态转移】: dp[i][j] = max(dp[i][j], dp[i][k]

47410
领券