参考题目:Acwing 1077. 皇宫看守

题意

给定一个树,求覆盖所有点的最少花费。

算法:树形DP

时间复杂度: O ( n ) O(n) O(n) (每个点只被搜索一次)

f 数组含义:

  • f[i][0],表示 i 号点的父节点放人的所有方案的最小花费。
  • f[i][1],表示 i 号点的子节点放人的所有方案的最小花费。
  • f[i][2],表示 i 号点自身放人的所有方案中的最小花费。
  • 根据定义,答案为min(f[root][1], f[root][2])(根节点不能被父节点覆盖,因为根节点没有父节点)。

st 数组含义:

  • st[i] = true,表示 i 号点有父节点。
  • st[i] = false,表示 i 号点没有父节点。

转移方程:

  • u,当前点;j,子节点。

  • f[u][0] += min(f[j][1], f[j][2]),表示 u 号点被父节点覆盖,其子节点只需取f[j][1,2]的最小值。

  • f[u][2] += min(min(f[j][1], f[j][2]), f[j][0]),表示u号点放人时,子节点只需取f[j][1,2,3]的最小值。

  • f[u][1] = f[k][2] + f[u][0] - min(f[k][1], f[k][2]),表示有一个子节点是放人的情况f[k][2],其余取f[j][1,2]两种情况的较小的一个。

代码

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 1510;int n;
int f[N][3];
int h[N], e[N], ne[N], w[N], idx;
bool st[N];void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}void dfs(int u)
{// 自己放人需要的花费。f[u][2] = w[u];for (int i = h[u]; ~i; i = ne[i]){// 取出子节点编号。int j = e[i];// 预处理出子节点的所有方案。 dfs(j);// 状态方程。f[u][0] += min(f[j][1], f[j][2]);f[u][2] += min(min(f[j][1], f[j][2]), f[j][0]);}// 因为需要用到f[u][0],所以先得把f[u][0]计算出来。f[u][1] = 1e9;for (int i = h[u]; ~i; i = ne[i]){int j = e[i];f[u][1] = min(f[u][1], f[j][2] + f[u][0] - min(f[j][1], f[j][2]));}
}int main()
{memset(h, -1, sizeof h);cin >> n;// 建图。for (int i = 0; i < n; i ++ ){int id, cost, cnt;cin >> id >> cost >> cnt;w[id] = cost;while (cnt -- ){int ver;cin >> ver;add(id, ver);st[ver] = true;}}// 有向图,需要找到根节点。int root = 1;while (st[root]) root ++ ;dfs(root);cout << min(f[root][1], f[root][2]) << endl;return 0;
}

参考资料:
https://www.acwing.com/video/418/

Acwing 1077. 皇宫看守相关推荐

  1. AcWing 1077. 皇宫看守(树形DP + 状态机DP)

    AcWing 1077. 皇宫看守(树形DP + 状态机DP) 一.问题 二.分析 1.思路分析 2.状态表示 3.状态转移 4.循环设计 5.初末状态 三.代码 一.问题 二.分析 1.思路分析 在 ...

  2. Acwing 1077.皇宫看守

    Acwing 1077.皇宫看守 题目 输入格式 输出格式 数据范围 输入样例 输出样例 样例解释 分析 详细代码 这是我第一篇博客,如有侵权或者不足的地方,我将予以修改,并改正 题目 太平王世子事件 ...

  3. AcWing 1077. 皇宫看守(详解)

    题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫.皇宫各个宫殿的分布,呈一棵树的形状,宫殿可视为树中结点,两个宫殿之间如果存在道路直接相连,则该道路视为树中的一条边.已知,在一个宫殿镇守的 ...

  4. 1077. 皇宫看守

    太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫各个宫殿的分布,呈一棵树的形状,宫殿可视为树中结点,两个宫殿之间如果存在道路直接相连,则该道路视为树中的一条边. 已知,在一个宫殿镇守的守卫不 ...

  5. AcWing1077. 皇宫看守(树形DP)题解

    题目传送门 题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见. 大内保卫森严,三步一岗,五步一哨,每个宫殿 ...

  6. CIA1 皇宫看守(树形dp)

    问题描述:太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候 ...

  7. 皇宫看守(guard)

    [问题描述] 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:有边直接相连的宫殿可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都 ...

  8. TYWZOJ[1580]皇宫看守

    题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候 ...

  9. 皇宫看守【SGOI-2】

    题目描述 问题描述: 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都 ...

最新文章

  1. centos查看python版本_CentOS系统python默认版本由python2改为python3
  2. xp系统qq安装不上网络连接服务器,winxp系统下QQ远程协助连不上如何解决
  3. tpm php,TPM系列
  4. zzulioj 1120: 最值交换
  5. ReportViewer教程(15)-矩阵报表-5
  6. 【高斯和拉普拉斯为什么分别对应L2和L1?】差分隐私系统学习记录(五)
  7. java awt编程_java awt编程
  8. hiho 第155周 任务分配
  9. 【有返回值的回溯法】剑指offer——面试题66:矩阵中的路径(回溯法)
  10. 搞定 Linux Shell 文本处理工具,看完这篇集锦就够了
  11. [线性筛][筛素数/筛约数个数]
  12. 读《About Face 4 交互设计精髓》1
  13. 给自己定个一年后的终极目标!
  14. 佛说:前世的五百次回眸,才换来今生的一次擦肩而过
  15. 爱情不是等你有空才珍惜的
  16. 阿里云 数据库mysql卸载安装,基本上所有坑全趟了
  17. word使用技巧---插入图片显示不全的解决方案
  18. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t
  19. cocos2d-x 植入广告(一) 百度横屏、插屏广告
  20. 最小生成树 算法思想及模板代码

热门文章

  1. 二进制位,字节,字,字长的概念与区分
  2. 【padStart() 和padEnd()方法】
  3. html复制按钮easyui,简化的EasyUI带图标按钮
  4. 数字逻辑——逻辑运算和算术运算
  5. SpringBoot @Scheduled注解(cron、fixedRate、fixedDelay、initialDelay)各个参数区别
  6. springboot 定时任务@Scheduled cron表达式、fixedRate、fixedDelay、initialDelay和@EnableAsync、@Async的结合使用
  7. 微信小程序之程序、页面注册及生命周期
  8. 2023年电脑学剪辑要用什么软件 电脑剪辑视频怎么学会
  9. flowable工作流节点总是自动跳过
  10. 第二章 逻辑门电路-复合逻辑门、集电极开路门、三态门