访问艺术馆
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
题解
题目描述 Description
皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画。艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室。皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的时间,由于经验老道,他拿下一副画需要5秒的时间。你的任务是设计一个程序,计算在警察赶来之前(警察到达时皮尔回到了入口也算),他最多能偷到多少幅画。

输入描述 Input Description
第1行是警察赶到得时间,以s为单位。第2行描述了艺术馆得结构,是一串非负整数,成对地出现:每一对得第一个数是走过一条走廊得时间,第2个数是它末端得藏画数量;如果第2个数是0,那么说明这条走廊分叉为两条另外得走廊。数据按照深度优先得次序给出,请看样例

输出描述 Output Description
输出偷到得画得数量

样例输入 Sample Input
60

7 0 8 0 3 1 14 2 10 0 12 4 6 2

样例输出 Sample Output
2

数据范围及提示 Data Size & Hint
s<=600

走廊的数目<=100

写在前面:自此,钻石天梯全部搞完,在noip前一天进入大师,求rp++
————————————————————————————————————————————————————————
解题思路:这里我真的不太想写,因为我的树型dp学的很渣很渣,这道题目也是看了别人的blog才知道如何实现建树(之前只知道是什么,但不知道具体怎么写),数据给出的就是dfs下的节点顺序,加上记忆化搜索就可以了。
(还是说一下dp思路吧,f[i][j]指到达第i个节点且还有j个时间单位下最大价值是多少,对于任意一个非叶节点i,它在j时间下的最大价值为f[i][j]=max(f[i][j],f[i的左儿子][t]+f[i的右儿子][j-t],t为循环变量,代表着分给左右儿子不同的时间得到不同的价值,取价值即可;如果是叶节点,那么我们只要判断分配给这个叶节点的时间够偷几幅画就可以了(时间够就全偷))
代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,f[1000][1000],now=1;
bool flag[1000][1000];//判断该状态之前是否已经找到过,避免重复搜索
int tot;
struct os
{int l,r,w,v;//左右儿子,代价,价值
}a[100000];
void build_tree()
{int k=now;if (a[k].v!=0) return;a[k].l=++now;build_tree();a[k].r=++now;build_tree();
}
void dfs(int x,int remain)
{if (flag[x][remain]) return;//之前有过就返回int t=remain-a[x].w;//真正能分配给左右儿子或偷画的时间tif (t<=0) return;if (a[x].l==a[x].r)f[x][remain]=min(t/5,a[x].v);//全偷or尽可能偷elsefor (int i=0;i<=t;i++){dfs(a[x].l,i);dfs(a[x].r,t-i);f[x][remain]=max(f[x][remain],f[a[x].l][i]+f[a[x].r][t-i]);}flag[x][remain]=true;
}
main()
{scanf("%d",&tot);int x,y;while (scanf("%d%d",&x,&y)!=EOF) a[++n].w=x*2,a[n].v=y;build_tree();dfs(1,tot);printf("%d",f[1][tot]);
}

【codevs1163】访问艺术馆,圣战の终焉相关推荐

  1. codevs1163访问艺术馆(树形dp)

    1163 访问艺术馆  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算 ...

  2. 【codevs1163】访问艺术馆

    problem solution codes //f[i,j]表示用j秒回到i最多拿几幅画 //链式建树 #include<iostream> #include<algorithm& ...

  3. CodeVs天梯钻石Diamond题解

    title: CodeVs天梯之Diamond date: 2017-12-28 tags: 天梯 CodesVs categories: OI CodeVs刷题攻略之Diamond 2018.1.1 ...

  4. B站 全套java面试(200道)问题MD(题目+答案)

    Java面向对象有哪些特征,如何应用 ​ 面向对象编程是利用类和对象编程的一种思想.万物可归类,类是对于世界事物的高度抽象 ,不同的事物之间有不同的关系 ,一个类自身与外界的封装关系,一个父类和子类的 ...

  5. ole db 访问接口 sqlncli 无法启动分布式事务_阿里终面:分布式事务原理

    本文提纲如下 前言 单数据源事务 & 多数据源事务 常见分布式事务解决方案 2.1. 分布式事务模型 2.2. 二将军问题和幂等性 2.3. 两阶段提交(2PC) & 三阶段提交(3P ...

  6. 【Spring 数据访问终篇】Spring + Hibernate + Mysql

    说来惭愧,数月没有更新博客,今天带来spring访问数据的最终篇,spring + hibernate. 本篇文章将用maven创建一个简答的java项目,并结合spring框架中的hibernate ...

  7. nuc-oj-最终圣战

    题目: zjh一觉醒来发现自己被困在了一个不为人知的地方,身边只有一幅地图,上面画着自己所在的位置,以及目的位置,落款竟然是zwt这个大魔王!!!为了找到zwt决战,并且不耽误时间,zjh想请你找到一 ...

  8. 字节终面:CPU 是如何读写内存的?

    如果你觉得这是一个非常简单的问题,那么你真应该好好读读本文,我敢保证这个问题绝没有你想象的那么简单. 注意,一定要完本文,否则可能会得出错误的结论. 闲话少说,让我们来看看CPU在读写内存时底层究竟发 ...

  9. 服务器安装centos5.5下安装samba服务器以及windows访问samba服务器

    最近使用开发的进程中出现了一个小问题,顺便记录一下原因和方法--服务器安装 windows下,想必大家都用过同享功能吧,的确很便利,直接把文件放在同享目录下即可. 那Linux下是如何实现这种同享功能 ...

最新文章

  1. 当谷歌员工来到新公司的那一天,发现原来公司什么都没有
  2. python(19)编码问题
  3. Linux服务器查看占用IO较高的进程
  4. 怎样用hibernate验证登陆界面的用户名和密码
  5. html5时钟代码菜鸟课程,html5绘制时钟动画
  6. mysql入门操作_对MySQL的几个入门操作
  7. Python中写一个乒乓球类的游戏
  8. 手机存储不足怎么办?用好这份清理指南你的手机还能再战三年
  9. 目标检测相关概念:IOU,precision, recall, AP, mAP
  10. LayaAir 位图添加遮罩与滤镜
  11. CCS 6.0 下载
  12. Windows 域时间同步
  13. Android手机玩8086汇编
  14. Linux proc目录详解
  15. os.path.dirname()用法
  16. video-play使用,vue2
  17. 邮箱smtp服务器及端口收集
  18. vscode的中文支持
  19. Roguelike+单机玩法游戏保护案例
  20. p5.js 交互应用实战 —— 音乐可视化(案例)

热门文章

  1. 服务器RAID技术基础
  2. Vue源码中compiler部分逻辑梳理(内有彩蛋)
  3. 韩顺平php视频笔记35 php运行过程
  4. jQuery学习之四---Ajax请求
  5. 释放变量所指向的内存_前端基础突破(二)内存回收与内存泄漏
  6. break continue区别和用法_因为不知道break和contiue的核心区别,他在初试就被刷了下来...
  7. java设置面板的大小_java – 设置面板的大小
  8. python画图显示中文乱码_解决Python pandas plot输出图形中显示中文乱码问题
  9. vue标签旋转_vue.js编写移动端页面,检测旋转屏幕,横竖屏。
  10. 樊登读书分享ppt_樊登读书精华分享-《分手后,成为更好的自己》