树状DP就是在树上的DP,指当前节点的解可以通过子孙节点的解求出,即状态转移方程是由子孙节点推出当前节点的。
使用遍历方法:由于树的一个特性,即任意两个节点之间只有一条路径,因此深搜时每个点只会访问一次,所以我们通常使用深搜来遍历,这时复杂度只有O(n)。在推出状态转移方程后,深搜大致过程如下(具体更新节点信息的位置视情况而定):
void dfs(int v, int fa)
{
for (int i = 0; i < edge[v].size(); i++)
{
int son = edge[v][i];
if (son == fa) continue;
dfs(son, v);
update(v); // 每计算一个儿子,都更新取值。
}
update(v); // 需要计算完所有儿子才能更新。
}
UVa1218-Perfect Service是一道典型的树状DP。
题意如下:
有n(n≤10000)台机器形成树状结构。要求把其中一些机器作为服务器,使得每台非服务器的计算机恰好与一台服务器相邻。求服务器的最小数量。
分析:
机器共有三种状态:
1. 服务器<