动态规划:树形DP
2024-08-26 15:45:17
典型例题有三道:
没有上司的舞会
选课
景点中心
我们可以把动态规划的状态和转移描述成DAG
对于有根树来说,如果我们规定边的方向由父节点指向叶子节点
或者是由叶子节点指向父节点(奇葩)
那么它也是一个DAG
如果状态和转移都发生在特殊的DAG,树上
叫做树形动态规划
在树规中,父节点的值通过所有子节点计算完毕之后得出
这里上晚会
1A还是很舒服的,毕竟以前敲得很熟了
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
const int maxm=;
int n;
int r[maxn],vis[maxn],f[maxn][];
int cnt;
int g[maxn];
struct Edge{int t,next;}e[maxm];
void addedge(int u,int v)
{
cnt++;
e[cnt].t=v;
e[cnt].next=g[u];
g[u]=cnt;
}
void dfs(int id)
{
f[id][]=r[id];
if(g[id]==) return;
//如果这是一个叶子,就到头了,我可是先赋值了给爹爹们用的哦
for(int tmp=g[id];tmp;tmp=e[tmp].next)
{
dfs(e[tmp].t);
f[id][]+=f[e[tmp].t][];
//选id则id的所有儿子全部GG
if(f[e[tmp].t][]>f[e[tmp].t][]) //如果不选id,要看儿子们是选好还是不选好
f[id][]+=f[e[tmp].t][];
else f[id][]+=f[e[tmp].t][];
}
}
int main()
{
int x,y;
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&r[i]);
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
addedge(y,x); //由BOSS指向员工这样遍历起来好处理
vis[x]=; //标记这个不是根,只有BOSS上面没人
}
for(int i=;i<=n;i++)
if(!vis[i])
{
dfs(i);
printf("%d",max(f[i][],f[i][]));
break;
}
return ;
}
最新文章
- Spire.DOC生成表格测试
- Spring.Scheduling.Quartz 作业的应用(定时任务和循环触发任务)
- My Notepad
- ubuntu 12.04禁用笔记本触摸板
- 树形菜单的json字符串的拼接
- CSS 实现:文字水平垂直居中
- 经常使用的webservice接口
- PHP 表单防止刷新提交的方法
- C#获取本周、上周、本月、上月、本季度、上季度、本年、上一年起始时间和结束时间
- 修改select选中项
- 给我的cnblogs主页做一个响应式布局模板
- linux之vi编辑器的基础命令
- 【转载】由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理
- 12块钱搭建一个ss(包括一个免费服务器)
- Java .classpath文件Classpath entry org.maven.eclipse.MAVEN2_CLASSPATH_CONTAINER will not be exported or published异常解决办法
- 1.1 为什么要使用lambda 表达式
- DNS服务详解
- 如何保证Redis的高并发
- input type = file 上传图片转为base64
- SQL Server 之 事务与隔离级别实例讲解
热门文章
- es2017中的async和await要点
- 如何修改Github上提交的错误用户地址和姓名
- gitbash避免每次push都输入密码
- CCF-NOIP-2018 提高组(复赛) 模拟试题(九)(2018 CSYZ长沙一中)
- flask_sqlalchemy中db.session是如何保持请求间独立的--源码阅读笔记
- 基于规则的中文分词 - NLP中文篇
- [leetcode-609-Find Duplicate File in System]
- 最短路径——Floyd算法(含证明)
- 利用calibre抓取新闻
- bcc编译