题目大意:有N座城市,要求在这N座城市中建一个消防系统,使得每座城市城市着火时都能被按时扑灭
现在给出每座城市建一个消防站所需的花费w和每座城市相邻消防站的最远距离lim(和该城市距离超过lim的城市的消防站无法救该城市的火),问要使所有的城市都能被救到火,建消防站的最小花费是多少
解题思路:参考了别人的题解,果然还是太弱了。。。
要使该城市能被救到火,那么消防站不是建在该点,就是建在以该点为根的子树上,或者是该点的父节点上,他肯定要依赖其中一个城市的消防站的
设dp[i][j]表示以i城市为根的树依赖j城市消防站的最低花费(该树的每个节点都符合要求),best[i]为以i城市为根的树最低消费(该树的所有节点都符合要求)
那么状态转移方程就是
dp[i][j] = w[j] + sum (min(dp[k][j] - w[j], best[k])) (k为i的子节点)
dp[k][j]表示因为k可以和i节点一样依赖于j,那么花费就是dp[k][j] - w[j],或者k节点不依赖于j,而依赖于别的节点,那就是best[k]了
以上参考了:http://blog.csdn.net/woshi250hua/article/details/7725917
#include<cstdio>
#include<algorithm>