移除盒子问题(进阶版)
字数 938 2025-11-13 12:38:47
移除盒子问题(进阶版)
题目描述:
给定一个整数数组 boxes,其中 boxes[i] 表示盒子的颜色。每次操作,你可以移除一些连续的相同颜色的盒子,获得 k × k 的分数(其中 k 是移除的盒子数量)。重复这个过程,直到所有盒子都被移除。求能获得的最大总分数。
解题过程:
- 问题分析
- 这是一个三维区间DP问题,比传统的二维区间DP更复杂
- 关键难点:移除中间某个连续段后,原本不相邻的同色盒子会相邻,产生连锁反应
- 需要记录的状态:区间[i,j] + 区间右侧与boxes[j]相同颜色的盒子数量
- DP状态定义
定义 dp[i][j][k] 表示:
- 区间 [i, j] 的盒子
- 在区间右侧有 k 个与 boxes[j] 颜色相同的盒子
- 在这种情况下,能获得的最大分数
- 状态转移思路
对于区间 [i, j],考虑两种策略:
- 策略1:直接移除末尾的连续同色盒子
- 策略2:在区间内寻找与末尾同色的位置,将区间分割
- 状态转移方程
情况1:直接移除末尾
dp[i][j][k] = dp[i][j-1][0] + (k+1)²
情况2:在区间内寻找分割点
对于所有位置 p (i ≤ p < j),如果 boxes[p] == boxes[j]:
dp[i][j][k] = max(dp[i][j][k], dp[i][p][k+1] + dp[p+1][j-1][0])
- 边界条件
- 当 i > j 时,分数为0
- 当 i == j 时,dp[i][j][k] = (k+1)²
- 计算顺序
- 按区间长度从小到大计算
- 对于每个区间,枚举所有可能的k值
-
算法实现步骤
步骤1:初始化三维DP数组
步骤2:处理长度为1的区间
步骤3:依次处理长度从2到n的区间
步骤4:对于每个区间[i,j],枚举k从0到n
步骤5:应用两种状态转移策略
步骤6:最终答案为dp[0][n-1][0] -
时间复杂度优化
- 使用记忆化搜索可以避免不必要的状态计算
- 预处理相同颜色的位置关系
这个问题的难点在于需要三维状态来记录右侧的连续同色盒子数量,通过合理的状态设计和转移,可以高效解决这个复杂的区间动态规划问题。