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

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

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

选 安全

选 不安全

不选 安全

不选 不安全

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

所以我们就可以设计状态为
表示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. 新疆大学(新大)OJ xju 1010: 四个年级 C++ STL map 将4层循环优化成2层循环可解

    1010: 四个年级 时间限制: 3 Sec  内存限制: 128 MB 题目描述 为了加强全体软件学院的同学的较量,学院想让ACM协会设计一次活动让所以软件学院的同学都加入,并且要实现高年级和低年级 ...

  2. Android 开发环境安装配置手册

    本文指导,如何一步步搭建Android开发平台. 1  下载软件 n JDK 1.5+   到  http://java.sun.com/javase/downloads/index.jsp 下载 n ...

  3. [NOI2015]品酒大会(后缀树+DP)

    后缀自动机有一个性质. 就是如果倒建SAM两个串的lcp就是这两个串的结束节点的LCA. 然后就可以愉快的跑DP了. 对于每一个后缀树上的节点\(u\),它对\(len[u]\)的贡献是\(\sum_ ...

  4. POJ 3261 Milk Patterns(后缀数组+单调队列)

    题意 找出出现k次的可重叠的最长子串的长度 题解 用后缀数组. 然后求出heigth数组. 跑单调队列就行了.找出每k个数中最小的数的最大值.就是个滑动窗口啊 (不知道为什么有人写二分,其实写啥都差不 ...

  5. PHP中比较有用的几个函数

    php_check_syntax 这个函数可以用来检查特定文件中的PHP语法是否正确. highlight_string 当你想要把PHP代码显示到页面上时,highlight_string()函数就 ...

  6. Pimple相关的源码

    已经有了非常好的Pimple的相关解析,建议先看下:Pimple - 一个简单的 PHP 依赖注入容器读 PHP - Pimple 源码笔记(上)读 PHP - Pimple 源码笔记(下) 这里通过 ...

  7. Linux用户与用户组

    Linux用户与用户组 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 用户的账号一方面可以帮助系统管 ...

  8. 10个关于Android开发的实用教程

    本文为致力于Android应用的开发人员精选了几个不错的实用教程,无论是初学者还是专业开发人员都应该能够从中获益.这些教程中有不少是关于绘图和地址服务运用的,另外一些则是SDK相关的.希望对大家有所帮 ...

  9. 零基础学python-6.2 共享引用

    这一章节说说共享引用 我们先举一个样例 a=1 b=a 上面的样例就是共享引用,这里我们说说整个过程: 1.创建一个对象1 2.创建一个变量a 3.把a和1所在的内存空间连接起来.就是a引用1 4.a ...

  10. 每一个程序猿都应该用MBP

    换笔记本的想法非常久了.前段时间换工作就想看换工作之后是什么情况吧. 可能工作配的笔记本就是MBP.后来发现是想多了,新工作的笔记本是Thinkpad X240. 配置全然够用了,8G内存+128G的 ...