这道题的难点在于状态怎么设计

这道题要求全部都是安全的,所以我们做的时候自底向上每一个结点都要是安全的

结合前一题当前结点选和不选,我们可以分出四种情况出来

选 安全

选 不安全

不选 安全

不选 不安全

显然选 不安全是不可能的,那么就去掉

所以我们就可以设计状态为
表示i放人且安全
表示i不放人且安全
表示i不放人且不安全

那么状态转移方程最关键的就是怎么保证回溯的时候都是安全的。

我们只考虑以u为结点的子树,不考虑i的父亲

我们要让u的子树除了u以外全部是安全的,u自己安全和不安全分开讨论

对于 , u放人且安全

那么显然这时儿子无论如何都是安全的(就算原来他是不安全的)

那么有

这里v是u的儿子,这时三种情况都可以,取最小

对于 i不放人且不安全

那么为了保证u不安全肯定儿子不能放人,而这时我们要保证

儿子都安全,所以

对于 i不放人且安全

儿子一定要安全的话有


但是要保证u安全,v中至少有一个放人

这就比较麻烦了,我们要专门来判断v中有没有放人

如果没有的话,就加上

也就是以最小的费用使一个儿子从不放人到放人

最后还有一个小细节,之前我写树形dp搜到叶子都直接return的

这里不行,因为这时是不存在的(不考虑u的父亲)

所以这时要把初始化为最大值(代码中体现为最后加上

#include<cstdio>
#include<vector>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 2123;
int f[3][MAXN], a[MAXN], b[MAXN], n;
vector<int> g[MAXN]; void dfs(int u)
{
f[0][u] = a[u];
f[1][u] = f[2][u] = 0; int mint = 1e8, ok = 0;
REP(i, 0, g[u].size())
{
int v = g[u][i];
dfs(v);
f[0][u] += min(f[0][v], min(f[1][v], f[2][v]));
f[1][u] += min(f[0][v], f[1][v]);
if(f[0][v] <= f[1][v]) ok = 1;
mint = min(mint, f[0][v] - f[1][v]);
f[2][u] += f[1][v];
}
if(!ok) f[1][u] += mint;
} int main()
{
scanf("%d", &n);
REP(i, 1, n + 1)
{
int u, k, son;
scanf("%d", &u);
scanf("%d%d", &a[u], &k);
REP(j, 0, k)
{
scanf("%d", &son);
g[u].push_back(son);
b[son] = 1;
}
} REP(i, 1, n + 1)
if(!b[i])
{
dfs(i);
printf("%d\n", min(f[0][i], f[1][i]));
break;
} return 0;
}

caioj 1111 树形动态规划(TreeDP)6: 皇宫看守 (状态设计)的更多相关文章

  1. caioj 1114 树形动态规划(TreeDP)3.0:多叉苹果树【scy改编ural1018二叉苹果树】

    一波树上背包秒杀-- #include<cstdio> #include<cstring> #include<algorithm> #include<vect ...

  2. caioj 1112 树形动态规划(TreeDP)7:战略游戏

    这道题和上一道题非常相似 这道题是看边,上一道是看点. 但是状态定义不同 看边的话没有不放不安全这种状态 因为当前结点的父亲无法让这颗子树没有看到的边看到 所以这种状态不存在 而上一道题存在不放不安全 ...

  3. 洛谷 P1273 有线电视网 && caioj 1109 树形动态规划(TreeDP)4:比赛转播(树上分组背包总结)

    从这篇博客往前到二叉苹果树都可以用分组背包做 这依赖性的问题,都可以用于这道题类似的方法来做 表示以i为根的树中取j个节点所能得的最大价值 那么每一个子树可以看成一个组,每个组里面取一个节点,两个节点 ...

  4. 洛谷 P2014 选课 && caioj 1108 树形动态规划(TreeDP)3:选课

    这里的先后关系可以看成节点和父亲的关系 在树里面,没有父亲肯定就没有节点 所以我们可以先修的看作父亲,后修的看作节点 所以这是一颗树 这题和上一道题比较相似 都是求树上最大点权和问题 但这道题是多叉树 ...

  5. caioj 1106 树形动态规划(TreeDP)1:加分二叉树

    解这道题的前提是非常熟悉中序遍历的方式 我就是因为不熟悉而没有做出来 中序遍历是5 7 1 2 10的话,如果1是根节点 那么5 7 1就是1的左子树,2, 10就是右子树 这就有点中链式dp的味道了 ...

  6. 1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)

    根据最近做的几道树形dp题总结一下规律.(从这篇往前到洛谷 P1352 ) 这几道题都是在一颗树上,然后要让整棵树的节点或边 满足一种状态.然后点可以影响到相邻点的这种状态 然后求最小次数 那么要从两 ...

  7. 【ACM/ICPC2013】树形动态规划专题

    前言:按照计划,昨天应该是完成树形DP7题和二分图.最大流基础专题,但是由于我智商实在拙计,一直在理解树形DP的思想,所以第二个专题只能顺延到今天了.但是昨天把树形DP弄了个5成懂我是很高兴的!下面我 ...

  8. 【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]

    [题解]保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006] 传送门:皇宫看守\([LOJ10157]\) 保安站岗 \([P2458]\) \([SDOI2006]\) [题目描述 ...

  9. 蓝桥杯 ALGO-4 结点选择 (树形动态规划)

    问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多少? 输入格式 第一行包含一个整数 n . 接下来的 ...

随机推荐

  1. 爬取xml数据之R

    生物信息很多时候要爬数据.最近也看了一些这些方面的. url<-"要爬取的网址" url.html<-htmlParse(url,encoding="UTF- ...

  2. Android之通过HttpURLConnection.getResponseCode状态码抛出异常的问题以及解决方法

    1.最近,在学习解析json数据的时候遇到一个错误信息,错误信息如下图所示:   发现解析出来的数据为空,错误信息如上图所示,发现程序中的HttpUtils工具类的22行出现了错误和MainActiv ...

  3. Pyinstaller 1 使用PyInstaller

    使用PyInstaller pyinstaller命令的语法是: pyinstaller[ options ] script [ script ...] | spec文件 在最简单的情况下,将当前目录 ...

  4. 【记录】Linux安装JDK详细步骤

    Linux安装JDK步骤1. 先从网上下载jdk(jdk-1_5_0_02-linux-i586.rpm) ,推荐SUN的官方网站www.sun.com,下载后放在/home目录中,当然其它地方也行. ...

  5. SLAM概念学习之随机SLAM算法

    这一节,在熟悉了Featue maps相关概念之后,我们将开始学习基于EKF的特征图SLAM算法. 1. 机器人,图和增强的状态向量 随机SLAM算法一般存储机器人位姿和图中的地标在单个状态向量中,然 ...

  6. SpringCloud学习笔记(20)----Spring Cloud Netflix之服务网关Zuul的各种姿势

    1. 禁用过滤器 # zuul.<SimpleClassName>.<filterType>.disable=true # 例如禁用 自定义的过滤器 zuul.MyFilter ...

  7. FCC高级编程篇之Exact Change

    Exact Change Design a cash register drawer function checkCashRegister() that accepts purchase price ...

  8. oracle 11G 配置侦听文件

    lsnrctl status   130  2017-08-23 03:15:16 oracle cat /etc/hosts   131  2017-08-23 03:15:26 oracle ca ...

  9. python 面向对象 继承

    什么是继承 继承表达的是一种”是“的关系,比如人是动物 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 继承是基于抽象的结 ...

  10. Fiddler 接口测试(Composer)的使用方法

    原文:Fiddler 接口测试(Composer)的使用方法 下载地址:https://www.telerik.com/download/fiddler 一.Composer简介 右侧Composer ...