1 条题解

  • 0
    @ 2025-11-18 16:56:02

    题目分析

    我们需要选择一些挂饰安装在手机上,使得总喜悦值最大。安装规则:

    • 直接挂在手机上的挂饰最多1个
    • 其他挂饰必须挂在某个挂钩上
    • 每个挂钩最多挂一个挂饰
    • 可以不安装任何挂饰

    关键思路

    问题转化

    这是一个带依赖关系的选择问题:

    • 每个挂饰需要占用一个挂钩(除了第一个直接挂在手机上的挂饰)
    • 每个挂饰提供一定数量的新挂钩
    • 净挂钩数 = 提供的挂钩数 - 占用的挂钩数 = Ai1A_i - 1(对于非第一个挂饰)

    核心观察

    1. 挂钩平衡:要安装 kk 个挂饰,至少需要 k1k-1 个挂钩(因为第一个挂饰直接连手机,不占挂钩)
    2. 动态规划状态:设 dp[i][j]dp[i][j] 表示考虑前 ii 个挂饰,剩余 jj 个可用挂钩时的最大喜悦值

    解法框架

    步骤1:预处理排序

    • 将挂饰按 AiA_i(挂钩数)降序排序
    • 原因:优先选择挂钩多的挂饰可以提供更多安装机会

    步骤2:动态规划

    状态定义:

    • dp[i][j]dp[i][j]:前 ii 个挂饰,剩余 jj 个挂钩时的最大喜悦值

    状态转移:

    1. 不选第 ii 个挂饰dp[i][j]=dp[i1][j]dp[i][j] = dp[i-1][j]
    2. 选第 ii 个挂饰
      • 如果是第一个挂饰(j=0j = 0):$dp[i][A_i-1] = \max(dp[i][A_i-1], dp[i-1][0] + B_i)$
      • 如果不是第一个(j>0j > 0):$dp[i][j + A_i - 1] = \max(dp[i][j + A_i - 1], dp[i-1][j] + B_i)$

    步骤3:初始化

    • dp[0][0]=0dp[0][0] = 0(不选任何挂饰)
    • 其他初始化为负无穷

    步骤4:答案提取

    答案为所有 dp[N][j]dp[N][j] 的最大值(j0j \ge 0

    算法复杂度

    • 排序:O(NlogN)O(N \log N)
    • 动态规划:O(N2)O(N^2)
    • 总复杂度:O(N2)O(N^2),对于 N2000N \le 2000 可接受

    实现细节

    1. 注意挂钩数的范围:最多 NN
    2. 处理负喜悦值的情况
    3. 允许不选任何挂饰(答案为0)
    4. 注意边界条件:挂钩数不能为负

    这种方法将问题转化为类似背包问题的动态规划,通过合理的状态设计和预处理排序,有效地解决了带依赖关系的选择优化问题。

    • 1

    信息

    ID
    5445
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者