1 条题解
-
0
题目分析
我们要求的是最优翻修方案的不便利值,即: [ \min_{\text{翻修方案}} \sum_{\text{乡村 } i} c_i \cdot (a_i + x_i) \cdot (b_i + y_i) ] 其中 是从乡村 到首都路径上未翻修的公路数, 是未翻修的铁路数。
问题转化
这是一个树形动态规划问题。对于每个城市,我们需要选择翻修公路还是铁路,这个选择会影响所有经过该城市的乡村的不便利值。
树形DP思路
由于树的结构特殊(从乡村到首都的路径唯一,且每个城市恰好有两条入边),我们可以用树形DP来解决。
状态定义
设 表示在节点 的子树中,从 到根节点路径上已经有 条未翻修公路、 条未翻修铁路时,该子树的最小总不便利值。
状态转移
对于叶子节点(乡村): 如果 是乡村,其参数为 ,则: [ dp[u][i][j] = c_u \cdot (a_u + i) \cdot (b_u + j) ]
对于城市节点: 设城市 的公路起点是 ,铁路起点是 。
-
情况1:翻修公路 公路变为已翻修,铁路未翻修: [ \text{cost}_{\text{road}} = dp[v_1][i][j] + dp[v_2][i][j+1] ]
-
情况2:翻修铁路 铁路变为已翻修,公路未翻修: [ \text{cost}_{\text{rail}} = dp[v_1][i+1][j] + dp[v_2][i][j] ]
取最小值: [ dp[u][i][j] = \min(\text{cost}{\text{road}}, \text{cost}{\text{rail}}) ]
算法流程
- 建立树结构,记录每个城市的公路和铁路起点
- 从叶子节点(乡村)开始向上DP计算
- 对于乡村节点,直接计算不便利值
- 对于城市节点,根据翻修选择计算最小代价
- 最终答案:(根节点没有未翻修道路)
优化策略
由于 ,直接开三维数组 会超内存。实际实现时可以采用:
- 记忆化搜索:只计算实际会出现的状态
- map存储:用 存储每个节点的状态
- 范围限制:利用题目条件 和路径长度 ,将 范围限制在
时间复杂度
每个节点的状态数最多为 ,总时间复杂度 ,经过优化后可以通过。
样例验证
以样例1为例:
- 翻修通往城市 和城市 的铁路,以及其他城市的公路
- 计算得到总不便利值为
- 与题目输出一致
总结
本题的关键在于:
- 将翻修选择转化为树形DP决策
- 设计包含路径上未翻修道路数量的状态
- 利用树的结构进行自底向上的计算
- 通过状态优化控制复杂度
这种方法可以高效求出最小不便利值,时间复杂度为 ,其中 是状态范围(约100)。
-
- 1
信息
- ID
- 3532
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 22
- 已通过
- 1
- 上传者