【codevs1163】访问艺术馆 树形dp
皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画。艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室。皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的时间,由于经验老道,他拿下一副画需要5秒的时间。你的任务是设计一个程序,计算在警察赶来之前(警察到达时皮尔回到了入口也算),他最多能偷到多少幅画。

第1行是警察赶到得时间,以s为单位。第2行描述了艺术馆得结构,是一串非负整数,成对地出现:每一对得第一个数是走过一条走廊得时间,第2个数是它末端得藏画数量;如果第2个数是0,那么说明这条走廊分叉为两条另外得走廊。数据按照深度优先得次序给出,请看样例
输出偷到得画得数量
60
7 0 8 0 3 1 14 2 10 0 12 4 6 2
2
s<=600
走廊的数目<=100
题解
一道树形dp
由题目描述可知艺术馆是一棵二叉树,并且除了根节点以外,其余的节点要么是叶子节点,要么是有两个子树的节点。
那么我们可以将根节点和根的子树分开考虑,便于运算。
f[i][j]表示在节点i处用不多于j秒的时间最多偷的画的数量,那么当i不是叶子节点时有状态转移方程
f[i][j]=max(f[l[i]][k-t[l[i]]]+f[r[i]][j-k-t[r[i]]]),
枚举j和k即可。
注意一下最终答案不是f[1][s],因为根节点到其儿子节点的时间没有考虑。
#include <stdio.h>
int s , l[601] , r[601] , f[601][601] , v[601] , t[601] , n;
int max(int a , int b)
{
return a > b ? a : b;
}
int min(int a , int b)
{
return a < b ? a : b;
}
void input()
{
n ++ ;
int a , b , now = n;
scanf("%d%d" , &a , &b);
t[now] = a;
if(b == 0)
{
l[now] = n + 1;
input();
r[now] = n + 1;
input();
}
else
v[now] = b;
}
void dp(int x)
{
int i , j;
if(l[x] == r[x])
{
for(i = s ; i >= 0 ; i -- )
f[x][i] = min(i / 5 , v[x]);
return;
}
dp(l[x]);
dp(r[x]);
for(i = s ; i >= 0 ; i -- )
{
for(j = i ; j >= 0 ; j -- )
{
if(j >= 2 * t[l[x]] && i - j >= 2 * t[r[x]])
f[x][i] = max(f[x][i] , f[l[x]][j - 2 * t[l[x]]] + f[r[x]][i - j - 2 * t[r[x]]]);
else if(j >= 2 * t[l[x]])
f[x][i] = max(f[x][i] , f[l[x]][j - 2 * t[l[x]]]);
else if(i - j >= 2 * t[r[x]])
f[x][i] = max(f[x][i] , f[r[x]][i - j - 2 * t[r[x]]]);
}
}
}
int main()
{
scanf("%d" , &s);
input();
dp(1);
printf("%d\n" , f[1][s - 2 * t[1]]);
return 0;
}
【codevs1163】访问艺术馆 树形dp的更多相关文章
- codevs1163访问艺术馆 树形dp
算裸的树形dp吧 回来复习一波 #include<cstdio> #include<cstring> #include<algorithm> #include< ...
- codevs1163访问艺术馆(树形dp)
1163 访问艺术馆 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备, ...
- [luogu 1270] “访问”美术馆 (树形dp)
传送门 Description 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer知道每 ...
- 洛谷 P1270 “访问”美术馆(树形DP)
P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer ...
- wikioi 1163 訪问艺术馆 树形dp
递归建树,由题知该树是一棵二叉树,且除根节点外其它点的度为0或2. dp[i][j]表示来到第i个走廊(还未走过这条走廊)还剩下j时间,能拿到最大的画的数量. dp[i][j]=max(dp[i][j ...
- 【codevs1163】访问艺术馆
题目描述 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的 ...
- codevs 访问艺术馆
/* codevs 1163 访问艺术馆 红果果的树形dp*/ #include<iostream> #include<cstdio> #include<cstring& ...
- 树形dp 入门
今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...
- 【BZOJ-3572】世界树 虚树 + 树形DP
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1084 Solved: 611[Submit][Status ...
随机推荐
- WPF DataGrid使用简介
1)自动生成列 <DataGrid AutoGenerateColumns="True" Name="datagrid" CanUserAddRows=& ...
- Drupal views 学习之初识
1. 简介 用过Yii框架的同学,应该都会用到过GridView和ListView组件.可以很方便的用网格或列表展示内容. 例如淘宝: 网格显示 列表显示 2. 使用view可以方便的配出类似上面的展 ...
- pandaboard es 制作SD启动卡OMAP4460
1. 本次使用的是chipsee的板子,带屏幕的,先把资料传到Ubuntu的共享目录下 2. 进入共享目录 /mnt/hgfs/ubuntu_share/pandboard_es_linux# 3. ...
- Spring学习(一)-----Spring 模块详解
官方下载链接:http://repo.spring.io/release/org/springframework/spring/ Spring 模块详解: Core 模块 spring-beans-3 ...
- Lua学习笔记(6): 函数
Lua的函数 函数用于简化程序,当某些工作需要重复执行的时候就可以使用函数减轻工作量(虽然复制粘贴也行) 语法: function 函数名(参数列表) 函数体 return 返回值 end --结束标 ...
- Node2vec 代码分析
Node2vec 代码从Github上clone到本地,主要是main.py和node2vec.py两个文件. 下面把我的读代码注释放到上面来, import numpy as np import n ...
- 产品需求文档(PRD)的写作 【转】
产品需求文档(PRD)的写作 一.文章的摘要介绍 无论我们做什么事都讲究方式方法,写产品需求文档(以下称PRD文档)也是如此,之前我通过四篇文章分享了自己写PRD文档的一些方法,而这一篇文章主要是 ...
- [笔记] mysql5.6一些编译参数
cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE ...
- python mongodb操作大全
数据库 增 use db1 #有则切换,无则新增 查 show dbs #查看所有 db #当前 删 db.dropDatabase() 集合: 增: db.user db.user.info db. ...
- wamp上能够访问jsp(未解决 游客勿看)
Windows下使用apache的jk_mod连接WAMP和Tomcat 发表于 2013 年 4 月 29 日 由 www.tonitech.com的站长 | 暂无评论 | Apache,Windo ...