【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 ...
随机推荐
- 20155332 2016-2017-2《Java程序设计》第1周学习总结
# 20155332 2016-2017-2<Java程序设计>第1周学习总结 教材学习内容总结 课本提问 1.Java平台概论:为什么需要Java程序设计语言? 2.Java平台概论:版 ...
- !important用法:
如果不加important特性,则超链接的颜色为蓝色,但是加上important之后优先级提高了,显示颜色为绿色 <style type="text/css"> a{ ...
- [BZOJ4444][SCOI2015]国旗计划-[ST表]
Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...
- 洛谷 P3369 【模板】普通平衡树(Treap/SBT)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...
- 搞懂.NET Framework 历史版本(2017年)
最近被.NET平台各种名词.以及各种版本弄得有些疑惑,开发和部署,对于开发平台版本选择是个基本问题,因此,花了些时间,学习汇总了有关.NET版本演进的历史. .NET简介 这个平台相信我们都知道,不过 ...
- 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型
人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...
- application/x-www-urlencoded与multipart/form-data
学习ajax时,学到了GET与POST两种HTTP方法,于是去W3C看了二者的区别,里面提到了二者的编码类型不同,就在网上查阅了相关资料, 在这里把我查阅到的相关结果记录在此,方便以后学习,详细了解一 ...
- SQL Server临时表漫谈
SQL Server是微软的关系型数据库,对于刚入门的我是一个非常友好的开发工具.可视化界面的安装与操作,非常适合刚入门的我. 其实大家要找这方面的资料,在网上一搜一大堆,这里我就不赘述那些了,基本都 ...
- Parcel 打包器简单使用记录
本文是构造 UI 轮子过程中搭建项目初始化时使用 Parcel 作为打包器的简要使用记录. 安装 参考 官方文档 使用 npm 进行 parcel-bundler 的安装. npm i -D parc ...
- 使用HackRF和外部时钟实现GPS欺骗实验
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...