我发现树形DP越来越有趣了……或者说树真的是一个很美妙的数据结构。
【题意】n个节点组成的树,要在树一些点上建立消防站,每个点建站都有个cost[i],每个点如果不在当前的点上建站,也要依赖其他的消防站,并且距离不超过limit[i]。求符合上述条件的最小费用建站方案。n <= 1000.
【思路】
想了很久没什么想法,状态表示和转移都没什么头绪……发现每个点它能从很多地方获取信息(父亲,爷爷,兄弟,叔叔,子孙)所以显得有点没有办法。但这题的n<=1000,没想到就是直接暴力枚举……
最主要的是维护两个数组:
best[u] ,表示根节点为u的子树满足要求的最小花费是多少,最后的答案就是best[1]
为了求best数组,我们再设一个辅助数组,
dp[u][j],表示节点u依附于j点时,根节点为u的子树满足要求的最小花费是多少
【状态转移】
best[u] = min(best[u] , dp[u][j]) j是枚举的点。
dp[u][j] =sum of( min( dp[v][j] - cost[j] , best[v]) )v是u的孩子。
不是很难理解吧。
这题也是一道十几年的经典老题……也是一道好题,难在思路怎么想,代码实现还是比较简单,代码也短,细节也少,不恶心……
【代码】
/* ***********************************************
Author :angon
************************************************ */
#include
#include
#include
#include
#include
#include
#include
#include
#include