洛谷 P1270 “访问”美术馆

P1270 “访问”美术馆

题目描述

经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动。艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室。Peer知道每个展室里藏画的数量,并且他精确测量了通过每条走廊的时间。由于经验老到,他拿下一幅画需要5秒的时间。你的任务是编一个程序,计算在警察赶来之前,他最多能偷到多少幅画。

洛谷  P1270  “访问”美术馆

输入输出格式

输入格式:

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

一个展室最多有20幅画。通过每个走廊的时间不超过20s。艺术馆最多有100个展室。警察赶到的时间在10min以内。

输出格式:

输出偷到的画的数量

输入输出样例

输入样例#1:
60
7 0 8 0 3 1 14 2 10 0 12 4 6 2
输出样例#1:
2
 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int f[][];
int police,num;
//num表示到目前为止 共有多少房间f[i][j] 表示 在节点
//i花费 时间 j 能够取得的 最多的画
//神奇的树形DP 先序遍历+DP
void dfs(int u){
int tim,p,i,j,k;
scanf("%d%d",&tim,&p);
tim*=;
if(!p){
int vl=++num,vr=++num;
dfs(vl),dfs(vr);
for(int j=tim;j<=police;j++)
for(k=;k<=j-tim;k++)
f[u][j]=max(f[u][j],f[vl][k]+f[vr][j-tim-k]);
return;
}
for(int i=;i<=police;i++)
f[u][i]=min((i-tim)/,p);
//花费的时间/5 == 得到的 画 的数量
}
int main(){
scanf("%d",&police);
police--;
dfs();
printf("%d\n",f[][police]);
return ;
}
/*我居然傻傻的以为这是道图论题、然后建图很麻烦
-->看了题解 这是道树形DP题
*/
 
上一篇:洛谷 P1270 “访问”美术馆(树形DP)


下一篇:【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)