[HNOI2018]道路 --- 树形DP

[HNOI2018]道路

题目描述:

W 国的交通呈一棵树的形状。W 国一共有 (n-1) 个城市和 (n) 个乡村,

其中城市从 (1) 到 (n-1) 编号,乡村从 (1) 到 (n) 编号,且 (1) 号城市是首都。

道路都是单向的,本题中我们只考虑从乡村通往首都的道路网络。

对于每一个城市,恰有一条公路和一条铁路通向这座城市。

对于城市(i), 通向该城市的道路(公路或铁路)的起点,要么是一个乡村,要么是一个编号比 (i) 大的城市。

没有道路通向任何乡村。除了首都以外,从任何城市或乡村出发只有一条道路;

首都没有往 外的道路。从任何乡村出发,沿着唯一往外的道路走,总可以到达首都。

W 国的国王小 W 获得了一笔资金,他决定用这笔资金来改善交通。

由于资金有限,小 W 只能翻修 (n-1) 条道路。

小 W 决定对每个城市翻修恰好一条通向它的道路,即从公路和铁 路中选择一条并进行翻修。

小 W 希望从乡村通向城市可以尽可能地便利,于是根据人口调 查的数据,

小 W 对每个乡村制定了三个参数,编号为 (i) 的乡村的三个参数是 (a_{i} ; b_{i} ; c_{i} )

假设 从编号为 (i) 的乡村走到首都一共需要经过 (x) 条未翻修的公路与 (y) 条未翻修的铁路,那么该乡村 的不便利值为

(c_{i} * (a_{i} + x) * (b_{i} + y))

在给定的翻修方案下,每个乡村的不便利值相加的和为该翻修方案的不便利值。

翻修 (n-1) 条道路有很多方案,其中不便利值最小的方案称为最优翻修方案,

小 W 自然 希望找到最优翻修方案,请你帮助他求出这个最优翻修方案的不便利值。

 

输入格式: 

第一行为正整数 (n)

接下来 (n-1) 行,每行描述一个城市。其中第 (i) 行包含两个数 (s_{i};t_{i}) 。 

(s_{i}) 表示通向第 (i) 座城市 的公路的起点, (t_{i}) 表示通向第(i)座城市的铁路的起点。

如果 (s_{i} > 0) ,那么存在一条从第 (s_{i}) 座城 市通往第 (i) 座城市的公路,否则存在一条从第 (s_{i})个乡村通往第(i)座城市的公路;

 (t_{i}) 类似地,如 果 (t_{i}>0) ,那么存在一条从第 (t_{i}) 座城市通往第(i)座城市的铁路,否则存在一条从第 (t_{i}) 个乡村通 往第 (i) 座城市的铁路。

接下来 (n) 行,每行描述一个乡村。

其中第(i)行包含三个数 (a_{i};b_{i};c_{i}),其意义如题面所示。

 

输出格式:

输出一行一个整数,表示最优翻修方案的不便利值。

 

改这题面真累。

看起来就像个DP题。

然后,可以发现是棵二叉树。。。

先看数据估计状态,通过计算,发现(O(n*dep*dep))接近极限

不妨设状态为(dp(i,j,k))

表示对于(i)号节点而言,首都到它的路径存在(j)个公路和(k)个铁路的最小权值。

不难想出:

对于乡村而言,(dp(i,j,k)=a_{i}*(b_{i}+j)*(c_{i}+k))

对于城市而言,(dp(i,j,k)=min(dp(ls,j+1,k)+dp(rs,j,k),dp(ls,j,k)+dp(rs,j,k+1)))

每一层中暴力枚举(40*40)次即可。

不用剪枝(反正复杂度过得去)

但是,空间开不下,因此要维护一个表示当前链的栈

注意到在DP中,每个状态只会被访问到一次,因此访问完(x),就可以回收(ls(x))和(rs(x))了

时间复杂度:(O(3200*n))

空间复杂度:(O(40^{3}*2))

这题为什么难呢?

因为它给人一种数论题的感觉。

代码在此

原文地址:https://www.cnblogs.com/reverymoon/p/8894083.html