1 条题解
-
0
题目大意
有 个定音鼓,每个鼓可以调到 到 的音调,且鼓的音调必须严格递增。有 个音符,每个音符在时间 需要音调 。一次只能调整一个鼓,求演奏过程中单次调整可用的最长时间的最大值。
算法思路
核心思想
状态压缩动态规划,枚举所有可能的鼓的音调组合。
关键观察
鼓的音调必须严格递增,因此有效状态数是组合数
对于 ,状态数最多为 ,可以枚举
调整时间受限于相邻音符间时间间隔和需要调整的鼓的数量
算法步骤
- 状态生成
用 DFS 生成所有可能的鼓的音调组合(严格递增)
用 map 将状态向量映射到整数编号
- 状态转移
f[i][s] 表示演奏到第 个音符时鼓的状态为 的最大可用调整时间
初始状态:第一个音符时,所有能演奏该音符的状态初始化为无穷大
转移:$f[i][t] = max(min(f[i-1][s], (T_i - T_{i-1}) / diff(s,t)))$
diff(s,t) 表示状态 到 需要调整的鼓的数量
取 min 是因为整个间隔的调整时间受限于最短的“一段”时间
- 可行性检查
flag[i][s] 表示状态 能否演奏第 个音符
即检查 是否在状态 的音调集合中
算法流程
预处理
生成所有合法的鼓状态
计算状态间的转移代价(需要调整的鼓数)
标记每个状态能否演奏每个音符
动态规划
初始化第一个音符的状态
按时间顺序进行状态转移
记录每个状态的最大可用调整时间
输出答案
取最后一个音符所有状态中的最大值
输出保留两位小数
复杂度分析
状态数:
时间复杂度:,在 时可接受
空间复杂度:
总结
本题是状态压缩DP的典型应用:
状态设计:利用音调严格递增的性质大幅减少状态数
可行性剪枝:预先计算每个状态能否演奏每个音符
最小值约束:调整时间受限于间隔时间和需要调整的鼓数
组合枚举:DFS 生成所有合法状态
这种"状态压缩 + 组合枚举"的方法在状态空间可控的组合优化问题中非常有效,特别适合处理类似乐器和资源配置的问题。
- 1
信息
- ID
- 4722
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者