dp学习(二)
树和图上的dp。
4. 简单树形dp
这些是最为简单的树形dp。
一般来说,树形dp是通过子树的dp值推出当前点的dp值。
在这里,我们默认当前节点为u,它的儿子节点为v,树的根为rt。
例题4.1 luoguP1122 最大子树和
状态转移方程:\(dp[u]=a[u]+\sum\max\{0,dp[v]\}\)
然后dfs就行了。答案为\(\max\{dp[u]\}\)
代码:
void dfs(int u)
{
vis[u]=1;
for(int i=h[u];i;i=e[i].nxt)
{
int p=e[i].to;
if(!vis[p])
{
dfs(p);
dp[u]+=max(0,dp[p]);
}
}
dp[u]+=a[u];
vis[u]=0;
}
例题4.2 luoguP1352 没有上司的舞会
树上最大权独立集问题。首先我们找到根rt。
这次要分两种情况讨论,这里用\(dp[u][0/1]\)表示当前节点是选还是不选。
我们有状态转移方程:
\(dp[u][0]=\sum\max\{dp[v][0],dp[v][1]\}\)
\(dp[u][1]=a[u]+\sum dp[v][0]\)
最后答案为\(\max\{dp[rt][0],dp[rt][1]\}\)
代码:
void dfs(int u)
{
for(int i=h[u];i;i=e[i].nxt)
{
int p=e[i].to;
dfs(p);
dp[u][0]+=max(dp[p][0],dp[p][1]);
dp[u][1]+=dp[p][0];
}
dp[u][1]+=a[u];
}
5. 树上背包
可以认为是之前“有依赖的背包”的拓展。这时,物品间的依赖关系构成了一棵树。
例题5.1 luoguP2014 选课
例题5.2 luoguP1273 有线电视网
6. 二次扫描法(换根dp)
例题6.1 luoguP3478 STA-Station
例题6.2 luoguP3647 连珠线
接下来讨论图上的dp。
7. DAG上的dp
最为简单的一种,先拓扑排序,再按照拓扑序dp。
例题7 luoguP3183 食物链
当前节点的dp值就是能到达这个节点的所有节点的值相加。
一开始我们将入度为0的点的dp值赋为1,最后统计的时候记得要将单独一个点的情况(无出度)特判一下。
这里给出拓扑排序部分的代码实现,统计答案略。
void toposort()
{
queue<int> q;
for(int i=1;i<=n;i++)
if(!indeg[i])
{
q.push(i);
dp[i]=1;
}
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=h[u];i;i=e[i].nxt)
{
int p=e[i].to;indeg[p]--;
dp[p]+=dp[u];
if(!indeg[p])q.push(p);
}
}
}
8. 基环树上的dp
例题8.1 luoguP1453 城市环路
例题8.2 luoguP2607 骑士
例题8.3 luoguP4381 Island
9. 后效性处理
dp学习(二)的更多相关文章
- 斜率优化DP学习笔记
先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...
- DP学习记录Ⅰ
DP学习记录Ⅱ 前言 状态定义,转移方程,边界处理,这三部分想好了,就问题不大了.重点在状态定义,转移方程是基于状态定义的,边界处理是方便转移方程的开始的.因此最好先在纸上写出自己状态的意义,越详细越 ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- Hbase深入学习(二) 安装hbase
Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- LCS最长公共子序列~dp学习~4
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 Palindrome Time Limit: 4000/2000 MS (Java/Others ...
- 记忆化搜索 dp学习~2
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...
随机推荐
- 【LeetCode】983. 最低票价 Minimum Cost For Tickets(C++ & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetco ...
- 【LeetCode】904. Fruit Into Baskets 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/fruit-in ...
- 【LeetCode】553. Optimal Division 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- Atcoder ABC137D:Summer Vacation(贪心)
D - Summer Vacation Time Limit: 2 sec / Memory Limit: 1024 MB Score : 400 points Problem Statement T ...
- 【Java例题】4.2 级数求和2
2. 计算级数之和: y=1/1!*x-1/3!*x^3+1/5!*x^5+...+ (-1)^n/(2n+1)!*x^(2n+1). 这里的"^"表示乘方,"!&quo ...
- 编写Java程序,在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字“[ 来自新华社 ]”,保存到一个新的 txt 文件内
查看本章节 查看作业目录 需求说明: 在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字"[ 来自新华社 ]",保存到一个新的 txt 文件内 实现思路: 创建 Sa ...
- Zabbix 代码执行漏洞复现 /zabbix-cve_2017_2824
环境: 利用docker将vulfocus环境pull到本地搭建 漏洞描述: Zabbix 是由Alexei Vladishev 开发的一种网络监视.管理系统,基于 Server-Client 架构. ...
- windows下的Python的下载与安装
Python的下载 Python下载要去官网下载,xdm,这里是网址 www.python.org 因为是外网所以打开下载会慢一些(不要着急的说) 这是python官网界面,跟着图片去下载(因为我这会 ...
- 如何跳出springboot的service层中某一个方法?
有一个需求,就是中断某个方法中的for循环 目前的做法是:for循环中,增加if判断,如果满足条件就return,会中断这个方法 for (int i = 0; i < totalIndex; ...
- Eclipse导入Zookeeper源码Version2017.11.3
将Zookeeper源码导入Eclipse, Zookeeper源码需要使用ant构建后才能导入Eclipse, 和Solr的源码一样也是使用ant构建的, 大部分可以参考Eclipse导入Solr源 ...