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】470. Implement Rand10() Using Rand7() 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- C1. 组队活动 Small(BNUOJ)
C1. 组队活动 Small Time Limit: 1000ms Memory Limit: 131072KB 64-bit integer IO format: %lld Java cl ...
- [数学]高数部分-Part V 多元函数微分学
Part V 多元函数微分学 回到总目录 Part V 多元函数微分学 多元函数微分的极限定义 多元函数微分的连续性 多元函数微分的偏导数 z=f(x, y) 多元函数微分-链式求导规则 多元函数-高 ...
- 登陆认证框架:SpringSecurity
最近想给自己的小系统搭建一个登录认证服务,最初是想着一套oauth2权鉴就可以,但是发现这个oauth2只是权鉴,具体的登录认证需要由 SpringSecurity来进行实现. 也就是说SpringS ...
- JavaScript交互式网页设计 • 【第8章 jQuery动画与特效】
全部章节 >>>> 本章目录 8.1 显示隐藏动画效果 8.1.1 show() 方法与hide() 方法 8.1.2 toggle()方法 8.1.3 实践练习 8.2 ...
- Count Sequences
\(考虑问题的转换,即把用n个球,分为r-l+2个部分,其中第1部分表示该区域的球值为l,第二部分表示该区域的球值为l+1\) \(......第r-l+2部分为不选该区域的球\) \(该问题等价于在 ...
- python requests发起请求,报“Max retries exceeded with url”
需要高频率重复调用一个接口,偶尔会出现"Max retries exceeded with url" 在使用requests多次访问同一个ip时,尤其是在高频率访问下,http连接 ...
- 初识python 之 离线搭建pyhive环境(含python3安装)
系统版本: centos6.5 python版本:python3.6.8 相关包存放目录:software 注意:以下操作需要用到root权限 安装python3 root操作 cd /lzh/sof ...
- iview在ie9及以上的兼容问题解决方案
兼容requestAnimationFrame let lastTime = 0 let vendors = ['ms', 'moz', 'webkit', 'o'] for (let x = 0; ...
- Anaconda3+CUDA10.1+CUDNN7.6+TensorFlow2.6安装(Ubuntu16)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...