1 条题解
-
0
题目解析:积木塔问题
问题理解
这是一个关于用立方体积木搭建塔的优化问题。我们需要选择一些积木,按照从大到小的顺序堆叠,使得塔的评分最高。评分由三部分组成:
- 稳定性要求:塔必须稳定,即下方的积木必须严格大于上方的积木
- 高度得分:塔的高度等于所有选中积木边长的和
- 风格扣分:相邻积木图案不同时,每对扣除c分
算法思路
关键观察
- 积木排序:输入已经按边长非递减顺序给出,这简化了处理过程
- 相同边长的处理:相同边长的积木不能同时出现在塔中(因为要求严格递减)
- 动态规划状态:使用
dp[x]表示以颜色x结尾的塔的最大得分 - 分组处理:将相同边长的积木作为一组处理
算法步骤
-
初始化
- 读取输入数据
- 初始化DP数组
dp,用于记录以每种颜色结尾的塔的最大得分 - 初始化
last_length数组,记录每种颜色最后一次使用的积木边长 - 初始化
max_dp,记录全局最大得分
-
分组处理积木
- 按边长分组处理积木,因为相同边长的积木不能同时使用
- 对于每组相同边长的积木:
- 对于组内每个积木,如果它的颜色最后一次使用的边长不等于当前边长(即可以安全使用)
- 更新该颜色的DP值:
dp[color] = max(dp[color] + length, max_dp + length - c) - 这表示两种选择:接在同颜色塔后(不扣分)或接在其他颜色塔后(可能扣分)
- 更新该颜色的DP值:
- 更新该颜色的最后使用边长为当前边长
- 对于组内每个积木,如果它的颜色最后一次使用的边长不等于当前边长(即可以安全使用)
- 更新全局最大得分
max_dp
-
输出结果
- 输出全局最大得分
max_dp
- 输出全局最大得分
复杂度分析
- 时间复杂度:O(n),因为我们只需要遍历所有积木一次,并对每组相同边长的积木进行常数次操作
- 空间复杂度:O(max_color),其中max_color是颜色编号的最大值
关键洞察
- 状态定义:DP状态定义为以特定颜色结尾的塔的最大得分,这样可以方便处理风格扣分
- 分组处理:将相同边长的积木分组处理,确保不会违反稳定性条件
- 转移方程:考虑两种转移方式 - 接在同颜色塔后(不扣分)或接在其他颜色塔后(可能扣分)
样例验证
样例1:
输入:
4 1 1 1 3 2 4 3 4 1处理过程:
- 边长1:颜色1,更新dp[1]=1
- 边长3:颜色2,更新dp[2]=3
- 边长4:颜色3和1,分别更新dp[3]=6,dp[1]=6 输出:6
样例2:
输入:
4 5 1 1 3 2 4 3 4 1处理过程:
- 边长1:颜色1,更新dp[1]=1
- 边长3:颜色2,更新dp[2]=3
- 边长4:颜色3和1,分别更新dp[3]=4,dp[1]=5 输出:5
总结
该问题通过巧妙的动态规划状态定义和分组处理策略,高效地解决了在复杂约束下的积木塔搭建问题。算法充分利用了输入有序的特点,通过维护以每种颜色结尾的最优解,避免了枚举所有可能的塔结构,实现了线性时间复杂度的解决方案。
- 1
信息
- ID
- 4892
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者