Acwing 1077. 皇宫看守
参考题目: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. 皇宫看守相关推荐
- AcWing 1077. 皇宫看守(树形DP + 状态机DP)
AcWing 1077. 皇宫看守(树形DP + 状态机DP) 一.问题 二.分析 1.思路分析 2.状态表示 3.状态转移 4.循环设计 5.初末状态 三.代码 一.问题 二.分析 1.思路分析 在 ...
- Acwing 1077.皇宫看守
Acwing 1077.皇宫看守 题目 输入格式 输出格式 数据范围 输入样例 输出样例 样例解释 分析 详细代码 这是我第一篇博客,如有侵权或者不足的地方,我将予以修改,并改正 题目 太平王世子事件 ...
- AcWing 1077. 皇宫看守(详解)
题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫.皇宫各个宫殿的分布,呈一棵树的形状,宫殿可视为树中结点,两个宫殿之间如果存在道路直接相连,则该道路视为树中的一条边.已知,在一个宫殿镇守的 ...
- 1077. 皇宫看守
太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫各个宫殿的分布,呈一棵树的形状,宫殿可视为树中结点,两个宫殿之间如果存在道路直接相连,则该道路视为树中的一条边. 已知,在一个宫殿镇守的守卫不 ...
- AcWing1077. 皇宫看守(树形DP)题解
题目传送门 题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见. 大内保卫森严,三步一岗,五步一哨,每个宫殿 ...
- CIA1 皇宫看守(树形dp)
问题描述:太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候 ...
- 皇宫看守(guard)
[问题描述] 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:有边直接相连的宫殿可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都 ...
- TYWZOJ[1580]皇宫看守
题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候 ...
- 皇宫看守【SGOI-2】
题目描述 问题描述: 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都 ...
最新文章
- centos查看python版本_CentOS系统python默认版本由python2改为python3
- xp系统qq安装不上网络连接服务器,winxp系统下QQ远程协助连不上如何解决
- tpm php,TPM系列
- zzulioj 1120: 最值交换
- ReportViewer教程(15)-矩阵报表-5
- 【高斯和拉普拉斯为什么分别对应L2和L1?】差分隐私系统学习记录(五)
- java awt编程_java awt编程
- hiho 第155周 任务分配
- 【有返回值的回溯法】剑指offer——面试题66:矩阵中的路径(回溯法)
- 搞定 Linux Shell 文本处理工具,看完这篇集锦就够了
- [线性筛][筛素数/筛约数个数]
- 读《About Face 4 交互设计精髓》1
- 给自己定个一年后的终极目标!
- 佛说:前世的五百次回眸,才换来今生的一次擦肩而过
- 爱情不是等你有空才珍惜的
- 阿里云 数据库mysql卸载安装,基本上所有坑全趟了
- word使用技巧---插入图片显示不全的解决方案
- 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t
- cocos2d-x 植入广告(一) 百度横屏、插屏广告
- 最小生成树 算法思想及模板代码
热门文章
- 二进制位,字节,字,字长的概念与区分
- 【padStart() 和padEnd()方法】
- html复制按钮easyui,简化的EasyUI带图标按钮
- 数字逻辑——逻辑运算和算术运算
- SpringBoot @Scheduled注解(cron、fixedRate、fixedDelay、initialDelay)各个参数区别
- springboot 定时任务@Scheduled cron表达式、fixedRate、fixedDelay、initialDelay和@EnableAsync、@Async的结合使用
- 微信小程序之程序、页面注册及生命周期
- 2023年电脑学剪辑要用什么软件 电脑剪辑视频怎么学会
- flowable工作流节点总是自动跳过
- 第二章 逻辑门电路-复合逻辑门、集电极开路门、三态门