1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)
根据最近做的几道树形dp题总结一下规律。(从这篇往前到洛谷 P1352 )
这几道题都是在一颗树上,然后要让整棵树的节点或边
满足一种状态。然后点可以影响到相邻点的这种状态
然后求最小次数
那么要从两个维度来设计状态
第一个维度
(1)以i为根的树的所有节点都满足这种状态
(2)以i为根的树的只有i不满足这种状态
第二个维度
(1)i这个点取
(2)i这个点不取
所以就会有四种状态,不过最近几道题都是直接pass掉了其中一种
只有三种状态。
状态设计好了就很好写转移方程了,记住转移的过程中孩子一定
要都满足状态,这样做下来才可以使得整棵树满足状态。
然后我们把这个模型套到这道题
第一个维度
亮表示以i为根的子树全部节点都亮
不亮表示以i为根的子树只有i不亮
第二个维度
i这个灯泡开或者不开
所以状态是
(1)f[i][0] 没开,亮
(2)f[i][1] 没开,没亮
(3)f[i][2] 开,亮
(4)f[i][3] 开,没亮
这里f[i][3]pass掉,因为你要把没亮变成亮需要根节点按按钮,
此时跟节点消耗一个操作,而孩子自己又消耗一个操作
如果是开,亮的话只用消耗孩子一个操作。
现在写状态转移方程
u表示根节点,v表示孩子
f[u][2] = sum(f[v][1])
这时跟节点一开就都亮了(f[u][2]一开始会初始化为1)
f[u][0] = sum(min(f[v][0], f[v][2]))
f[u][1] = sum(min(f[v][0], f[v][2]))
这里有个奇偶数的问题,令sum = sum(min(f[v][0], f[v][2]))
不仅要算出sum
然后还要算出以最小花费把其中一个min换成另外一个操作的值,即sum + mint
假设f[v][2]是奇数,意味着当前是亮的,所以f[u][1] = sum + mint,f[u][0] = sum
如果是偶数,就反过来,f[u][1] = sum,f[u][0] = sum + mint
这里有小细节,到叶子结点的时候,f[u][0]是不可能的(不考虑父亲)
那么这时按照程序f[u][0]会等于无穷大,所以相当于不可能
1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)的更多相关文章
- caioj 1111 树形动态规划(TreeDP)6: 皇宫看守 (状态设计)
这道题的难点在于状态怎么设计 这道题要求全部都是安全的,所以我们做的时候自底向上每一个结点都要是安全的 结合前一题当前结点选和不选,我们可以分出四种情况出来 选 安全 选 不安全 不选 安全 不选 不 ...
- 树形动态规划(树状DP)小结
树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...
- js实现树级递归,通过js生成tree树形菜单(递归算法)
方法封装: /** * 数据转换为树形(递归),示例:toTreeByRecursion(source, 'id', 'parentId', null, 'children') * @param {A ...
- 蓝桥杯 ALGO-4 结点选择 (树形动态规划)
问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多少? 输入格式 第一行包含一个整数 n . 接下来的 ...
- 轻量级jquery框架之--树(tree)
前言 在常用的UI组件中,树形组件与数据列表组件可以说是构成一个管理平台基本的两大数据核心组件.树形组件用于系统菜单,数据列表用于数据表现,两者配合即可完成一个简单的数据系统.要实现一个支持复选.工具 ...
- vue+element-ui之tree树形控件有关子节点和父节点之间的各种选中关系详解
做后端管理系统,永远是最蛋疼.最复杂也最欠揍的事情,也永远是前端开发人员最苦逼.最无奈也最尿性的时刻.蛋疼的是需求变幻无穷,如同二师兄的三十六般变化:复杂的是开发难度寸步难行,如同蜀道难,难于上青天: ...
- elementUI Tree 树形控件--官方文档
一.基础用法基础的树形结构展示,props相当于一个对实体类对像 <template> <el-tree :data="data" :props="de ...
- CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树
http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...
- 图论&动态规划:虚树
虚树可以看做是对树形动态规划的一种求解优化 对于需要求答案的点p,只保留对答案有影响的节点,从而减少时间 BZOJ2286 dp[i]=min(val[i],Σdp[j](j为i的儿子)),val[i ...
随机推荐
- [洛谷P3391]【模板】文艺平衡树(Splay)
题目大意:给定一个$1\sim n$的序列,每次翻转一个区间,输出最后的序列. 解题思路:Splay的区间翻转操作.我借此打了个Splay的模板(运用内存池,但有些功能不确定正确,例如单点插入). 大 ...
- [读书笔记] R语言实战 (十三) 广义线性模型
广义线性模型扩展了线性模型的框架,它包含了非正态的因变量分析 广义线性模型拟合形式: $$g(\mu_\lambda) = \beta_0 + \sum_{j=1}^m\beta_jX_j$$ $g( ...
- AMD包下载及使用
AMD下载 下载地址 选择837.zip下载即可,将837.zib考入相应的文件夹下,并解压缩 wget http://netlib.org/toms/837.zip unzip 837.zip cd ...
- linux内核(一)基础知识
1,linux内核的基础知识 1.1 linux内核版本 从内核源码顶层目录Makefile中可以看到: VERSION和PATCHLEVEL组成主版本号,比如2.4.2.5.2.6等,稳定版本的德主 ...
- C++ STL之list具体解释
list容器是一个双向链表,能够高效地进行插入删除元素. 构造函数 list<Elem> c;//空list list<int> c(3);//创建一个含有三个默认值是0的元素 ...
- php 设计模式之工厂模式
php 设计模式之工厂模式 简介: 在开发大型系统过程中,往往会出现这样一种情况: 我有一部分基础数据,是类classA是从数据库A读取出来的,其他很多的功能都是基于这个基础数据来操作的.现在呢,我想 ...
- PJNATH介绍 -- 开源的用于NAT穿透的ICE, STUN和TURN
原文地址:http://blog.pjsip.org/2007/04/06/introducing-pjnath-open-source-ice-stun-and-turn/ ICE是什么? 对于那些 ...
- Idea配置文件的读取
开发过程中遇到配置文件读取问题,因此记录以后运用的到. 配置文件位置: 配置文件内容: default_size = 100 grid_size = 20 delayTime = 200 配置文件读取 ...
- 138.安全退出的异常,要用throw 尽量不用exit(0)
#include<iostream> #include<cstdlib> using namespace std; ////非安全退出,结束进程, //C++ 必须释放对象,最 ...
- 16.boost图深度优先遍历DFS
#include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...