【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 ...
随机推荐
- 1178: [Apio2009]CONVENTION会议中心
1178: [Apio2009]CONVENTION会议中心 https://lydsy.com/JudgeOnline/problem.php?id=1178 分析: set+倍增. 首先把所有有包 ...
- 17、JAVA多线程和并发基础面试问答
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- js插件实现一键复制功能
clipboard.js 可以实现纯 JS 的从浏览器复制文本到系统剪贴板的功能. 使用方法: 1. 下载 clipboard.js,并在页面中引入该插件.clipboard.js 下载地址: htt ...
- 初识JMM
目录 what is JMM? JMM变量存储结构 JMM三大特性 原子性 可见性 有序性 java 堆栈 静态存储 栈式存储 堆式存储 JVM是啥 参考<Inside JVM> what ...
- asp.net 问题:Web 服务器上的请求筛选模块被配置为 拒绝包含的查询字符串过长的请求
发现问题: post请求,在发送一个图片base64编码的字符串时,服务端报这个错误. 报错信息中给出了解决办法: 最可能的原因: Web 服务器上的请求筛选被配置为拒绝该请求,因为查询字符串过长. ...
- Appium+python HTML测试报告(1)(转)
(原文:https://www.cnblogs.com/fancy0158/p/10054632.html) 测试任务执行完成后,我们需要一份通俗易懂的测试报告来展示自动化测试的结果. HTMLTes ...
- sql 命令使用简单记录
半个月前就想记下用过的SQL命令的!!! 主题: 按时间查询: https://blog.csdn.net/hejpyes/article/details/41863349 左关联: se ...
- 广东ACM省赛 E题
题意: 输入一个P 使得存在一个一个N大于等于P, 并且存在m 等于 m/n * (m-1)/(n-1)=1/2. 思路 此题可以利用佩尔方程求解, 也可以打表解决.本次我解决利用的是佩尔方程(其实也 ...
- 33.[LeetCode] Search in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...
- python正则表达式re之compile函数解析
re正则表达式模块还包括一些有用的操作正则表达式的函数.下面主要介绍compile函数. 定义: compile(pattern[,flags] ) 根据包含正则表达式的字符串创建模式对象. 通过py ...