典型例题有三道:

没有上司的舞会

选课

景点中心

我们可以把动态规划的状态和转移描述成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 ;
}

最新文章

  1. Spire.DOC生成表格测试
  2. Spring.Scheduling.Quartz 作业的应用(定时任务和循环触发任务)
  3. My Notepad
  4. ubuntu 12.04禁用笔记本触摸板
  5. 树形菜单的json字符串的拼接
  6. CSS 实现:文字水平垂直居中
  7. 经常使用的webservice接口
  8. PHP 表单防止刷新提交的方法
  9. C#获取本周、上周、本月、上月、本季度、上季度、本年、上一年起始时间和结束时间
  10. 修改select选中项
  11. 给我的cnblogs主页做一个响应式布局模板
  12. linux之vi编辑器的基础命令
  13. 【转载】由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理
  14. 12块钱搭建一个ss(包括一个免费服务器)
  15. Java .classpath文件Classpath entry org.maven.eclipse.MAVEN2_CLASSPATH_CONTAINER will not be exported or published异常解决办法
  16. 1.1 为什么要使用lambda 表达式
  17. DNS服务详解
  18. 如何保证Redis的高并发
  19. input type = file 上传图片转为base64
  20. SQL Server 之 事务与隔离级别实例讲解

热门文章

  1. es2017中的async和await要点
  2. 如何修改Github上提交的错误用户地址和姓名
  3. gitbash避免每次push都输入密码
  4. CCF-NOIP-2018 提高组(复赛) 模拟试题(九)(2018 CSYZ长沙一中)
  5. flask_sqlalchemy中db.session是如何保持请求间独立的--源码阅读笔记
  6. 基于规则的中文分词 - NLP中文篇
  7. [leetcode-609-Find Duplicate File in System]
  8. 最短路径——Floyd算法(含证明)
  9. 利用calibre抓取新闻
  10. bcc编译