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

  • 一、问题
  • 二、分析
    • 1、思路分析
    • 2、状态表示
    • 3、状态转移
    • 4、循环设计
    • 5、初末状态
  • 三、代码

一、问题

二、分析

1、思路分析

在讲解这道题之前,大家需要对状态机DP有一定的了解,如果不了解或者不太清楚的话,可以先去看作者之前的文章:第四十七章 动态规划——状态压缩模型

我们用下面的图进行分析:

我们以2号点为例子,观察一下能够看到2号点的点:
2号点的父节点:1

2号点的子节点:4和5

2号点自己

如果我们不选2号点的话,分为下面两种情况:
第一种:
如果2号点能够被父节点看到的话,那么2号点的子节点4和5选不选都行。因为2号点已经有人能看到了。
第二种:
如果2好点能够被子节点看到的话,那么2号点的子节点至少选一个,由于题目中要求的是最小,所以我们只要在子节点中选一个就行。

如果我们选了2号点,即2号点能够被自己看到的话:

子节点随便选,挑一个最小值的就行。

我们发现2号点选和不选对于子树的选择也产生了一定的影响,因此我们需要采用状态机DP。

2、状态表示

f [ u ] [ j ] f[u][j] f[u][j]表示在以 u u u为根节点的树中,当 u u u的状态是 j j j的时候,我们选择的最少节点。

其中:

j = 0 j=0 j=0的时候,表示 u u u不选,但是 u u u能够被父亲观察到。

j = 1 j=1 j=1的时候,表示 u u u不选,但是 u u u能够被子节点看到。

j = 2 j=2 j=2的时候,表示选 u u u, u u u至少能被自己看到。

3、状态转移

我们一个情况一个情况的分析:

j = 0 j=0 j=0的时候

u u u没选,那么对于其子节点而言, f [ s o n ] [ 0 ] f[son][0] f[son][0]就是不存在的,因为这个状态是说没有选节点 s o n son son,但是 s o n son son能够被父节点观察到。我们根本就没选它的父节点 u u u,又怎么会被观察到呢?所以这种情况不存在。

那么由于 u u u已经被父节点观察到了,那么他的子节点 s o n son son选或者不选,能被谁看到,对于 u u u而言是不重要的,我们只需要选出一个最小值即可。

那么针对每个子树都选出一个最小值,最后加在一起就行了。

f [ u ] [ 0 ] = ∑ m i n ( f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) f[u][0]=\sum min(f[son][1],f[son][2]) f[u][0]=∑min(f[son][1],f[son][2])

j = 1 j=1 j=1的时候
u u u没选,并且 u u u能够被子节点观察到,由于 u u u没选,根据刚刚的理由,我们子节点状态中合法的只有两个了: f [ s o n ] [ 1 ] f[son][1] f[son][1]和 f [ s o n ] [ 2 ] f[son][2] f[son][2]

题目中要求至少,也就是我们需要拿出一个son是必须选状态 f [ s o n ] [ 2 ] f[son][2] f[son][2]的,其余的在两个状态之间选出一个最小值,最后加在一起。

但是我们具体拿出来哪个还是不确定的,所以我们需要枚举一下,然后在所有的情况中再选最小值。

f [ u ] [ 1 ] = m i n ( f [ s o n k ] [ 2 ] + ∑ i ≠ k m i n ( f [ s o n i ] [ 1 ] , f [ s o n i ] [ 2 ] ) ) f[u][1]= min\bigg(f[son_k][2]+\sum_{i \neq k} min(f[son_i][1],f[son_i][2])\bigg) f[u][1]=min(f[sonk​][2]+i=k∑​min(f[soni​][1],f[soni​][2]))

j = 2 j=2 j=2的时候
这个情况是最好处理的,这种情况说明我们选了 u u u,那么子节点的三种情况都可选,挑一个最小的就行。
f [ u ] [ 2 ] = m i n ( f [ s o n ] [ 0 ] , f [ s o n ] [ 1 ] , f [ s o n ] [ 2 ] ) f[u][2]=min(f[son][0],f[son][1],f[son][2]) f[u][2]=min(f[son][0],f[son][1],f[son][2])

4、循环设计

我们这个是1维的,所以写一个for循环就行,但是由于我们的这些节点存储在了树上,所以我们需要用DFS代替。

5、初末状态

f [ u ] [ 2 ] = v [ u ] f[u][2]=v[u] f[u][2]=v[u],因为这个状态说明我们选了节点 u u u。

三、代码

由于是从根节点开始,所以需要选出根节点,即我们标记所有的子节点,最后剩下的就是根节点 r o o t root root。

#include<bits/stdc++.h>
using namespace std;
const int N = 1510, M = 2 * N;
const int INF = 0x3f3f3f3f;
int h[N], e[M], ne[M], v[N], idx;
bool son[N];
int n;
int f[N][3];
void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u)
{f[u][2] = v[u];int sum = 0;for(int i = h[u]; i != -1; i = ne[i]){int j = e[i];dfs(j);f[u][0] = f[u][0] + min(f[j][1],f[j][2]);f[u][2] = f[u][2] + min(min(f[j][0], f[j][1]), f[j][2]); sum += min(f[j][1], f[j][2]);}f[u][1] = INF;for(int i = h[u]; i != -1; i = ne[i]){int j = e[i];f[u][1] = min(f[u][1], sum - min(f[j][1], f[j][2]) + f[j][2]);}
}
int main()
{memset(h, -1, sizeof h);cin >> n;int root = 1;for(int i = 0; i < n; i ++ ){int j, k, m;cin >> j >> k >> m;v[j] = k;while(m -- ){int a;cin >> a;add(j, a);son[a] = true;}}while(son[root])root ++;dfs(root);cout << min(f[root][1], f[root][2]) << endl;
}

AcWing 1077. 皇宫看守(树形DP + 状态机DP)相关推荐

  1. Acwing 1077.皇宫看守

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

  2. Acwing 1077. 皇宫看守

    参考题目:Acwing 1077. 皇宫看守 题意 给定一个树,求覆盖所有点的最少花费. 算法:树形DP 时间复杂度: O ( n ) O(n) O(n) (每个点只被搜索一次) f 数组含义: f[ ...

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

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

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

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

  5. 1077. 皇宫看守

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

  6. 算法套路十七——买卖股票问题:状态机 DP

    算法套路十七--买卖股票问题:状态机 DP 状态机DP是一种将动态规划方法应用于有限状态机(Finite State Machine)的问题求解方法. 状态机DP(State Machine DP)是 ...

  7. Acwing:COW(DP+状态机 Python)

    奶牛贝茜在她最喜欢的牧场中发现了一块石碑,上面刻有神秘的碑文. 碑文的文字似乎来自一种神秘的古代语言,可看作一个只包含 C,O,W三种字符的字符串. 尽管贝茜无法解密该文字,但是她很欣赏 C,O,W按 ...

  8. 1884 COW(递推、状态机dp)

    1. 问题描述: 奶牛贝茜在她最喜欢的牧场中发现了一块石碑,上面刻有神秘的碑文.碑文的文字似乎来自一种神秘的古代语言,可看作一个只包含 C,O,W 三种字符的字符串.尽管贝茜无法解密该文字,但是她很欣 ...

  9. CF 1324-F Maximum White Subtree //树形换根dp

    题目链接 http://codeforces.com/problemset/problem/1324/F 题意 给你一棵树( n n n 个顶点)和一个数组 a i a_i ai​,每个顶点要不是白色 ...

最新文章

  1. DFS template and summary
  2. python官网下载步骤2019-Python IDE开发工具下载
  3. js对html进行转义和反转义的操作
  4. 15个学习习惯,受益一生(强烈推荐)
  5. ember.js mysql_用AWS部署ember.jspadrino应用系列之一
  6. 基于linux 的2048
  7. epoll nio区别_高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?...
  8. html内容权重计算,HTML CSS 选择器权重计算规则
  9. laravel5.5路由使用name的好处
  10. Codeforces 888E - Maximum Subsequence
  11. Java开发企业微信功能
  12. 2022智博会| 麒麟信安携操作系统亮相华为展台
  13. 机器学习/深度学习算法学习心得
  14. uniapp遇到后台返回base64码格式图片没有显示出来
  15. 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明
  16. ajax实现直播功能,jquery实现直播弹幕效果
  17. 吉大17秋计算机应用二,吉大17秋《计算机应用基础》在线作业二.doc
  18. 商业研究(10):比呀比-海淘电商-海外正品直邮-高品质跨境购物平台
  19. Android电池信息
  20. 什么是表示学习(representation learning)表征学习 表达学习

热门文章

  1. 博纳影业年营收20亿:净亏1.94亿 财务总监刘钦辉去世
  2. 入对行,跟对人,努力喜欢你周围的人
  3. 负采样Negative Sampling
  4. MotionBert论文解读及详细复现教程
  5. MySQL 高级知识(索引、优化)
  6. 谷歌浏览器导出部分文件夹中的书签
  7. golang安装protoc和gRPC步骤
  8. Spring定时任务@Scheduled注解使用配置方式(cron表达式、fixedRate和fixedDelay)
  9. centos7.5 定时任务不执行,定时任务日志报错信息为 MAIL (mailed 68 bytes of output but got status 0x004b#012)
  10. jzoj2248 送快递 (很鸡儿巧的题)