访问艺术馆 (Codevs No.1163)

2016-05-31 20:48:47

题目链接: 访问艺术馆 (Codevs No.1163)

题目大意:

  一个贼要在一个二叉树结构的艺术馆中偷画,画都处于叶子节点处,偷画和经过走廊都需要时间,求在限定时间内可以偷到最大数量

解法:

  树状DP (记忆化搜索实现)

  DP[i][j]表示到达i节点时还有j的时间来移动可以偷到的最大数量

  状态转移:

    对于叶子节点,直接按时间剩余返回最大偷画数量  

    对于非叶子节点,最大值可能来自Lson一边,也可能只来自Rson一边,还有可能是Lson,Rson按某种方式分配时间得来

  话说这题按照深度优先顺序给树有点坑啊

需要注意的地方:

  1.偷画是要有来有回的,所以要把走廊的长度*2

  2.第一条走廊并不满足二叉结构,可以直接手动去掉

 1 //访问艺术馆 (Codevs No.1163)
 2 //树状DP
 3 #include<stdio.h>
 4 #include<algorithm>
 5 #include<string.h>
 6 using namespace std;
 7 const int maxn=110;
 8 const int maxt=610;
 9 int DP[maxn][maxt];
10 int T;
11 int Index=1;
12 int val[maxn];
13 int lson[maxn];
14 int rson[maxn];
15 int lenlson[maxn];
16 int lenrson[maxn];
17 void Build(int now)
18 {
19     int len,num;
20     scanf("%d %d",&len,&num);
21     lson[now]=++Index;
22     lenlson[now]=len*2;
23     if(num==0)Build(lson[now]);
24     else val[lson[now]]=num;
25     scanf("%d %d",&len,&num);
26     rson[now]=++Index;
27     lenrson[now]=len*2;
28     if(num==0)Build(rson[now]);
29     else val[rson[now]]=num;
30     return ;
31 }
32 int DFS(int x,int time)
33 {
34     if(time<0)return -100000;
35     if(DP[x][time]>-1)return DP[x][time];
36     if(lson[x]==0&&rson[x]==0)
37     {
38         for(int i=val[x];i>=0;i--)
39         {
40             if(time-i*5>=0)return DP[x][time]=i;
41         }
42     }
43     DP[x][time]=0;
44     DP[x][time]=max(DP[x][time],DFS(lson[x],time-lenlson[x]));
45     DP[x][time]=max(DP[x][time],DFS(rson[x],time-lenrson[x]));
46     for(int i=lenlson[x];time-i>=lenrson[x];i++)
47     {
48         DP[x][time]=max(DP[x][time],DFS(lson[x],i-lenlson[x])+DFS(rson[x],time-i-lenrson[x]));
49     }
50     return DP[x][time];
51 }
52 int main()
53 {
54     int x,y;
55     scanf("%d",&T);
56     scanf("%d %d",&x,&y);
57     if(y==0)
58     {
59         Build(1);
60     }
61     memset(DP,-1,sizeof(DP));
62     DFS(1,T-x*2-1);
63     if(T-x*2-1>=0)printf("%d",DP[1][T-x*2-1]);
64     else printf("0");
65     return 0;
66 }
时间: 2024-12-15 01:49:39

访问艺术馆 (Codevs No.1163)的相关文章

codevs 访问艺术馆

/* codevs 1163 访问艺术馆 红果果的树形dp*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 210 using namespace std; int n,m,lc[maxn],rc[maxn],g[maxn][2],T,v[maxn],f[maxn][maxn*6],x,y; struct node{ int v,t,pre; }e[maxn*2]; void df

wikioi 1163 访问艺术馆 树形dp

递归建树,由题知该树是一棵二叉树,且除根节点外其他点的度为0或2. dp[i][j]表示来到第i个走廊(还未走过这条走廊)还剩下j时间,能拿到最大的画的数量. dp[i][j]=max(dp[i][j],dp[lson[i]][k]+dp[rson][last_time-k]) #include<cstdio> #include<algorithm> using namespace std; int dp[200][700]; int id=0,x,y,s; struct node

codevs1163访问艺术馆(树形dp)

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

【树上动规】【codevs 1163】访问艺术馆

题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的时间,由于经验老道,他拿下一副画需要5秒的时间.你的任务是设计一个程序,计算在警察赶来之前(警察到达时皮尔回到了入口也算),他最多能偷到多少幅画. 输入描述 Input Description 第1行是警察赶到得时间,以s为单位.第2行描述了艺术馆得结构,是一串非负整数,成对

访问艺术馆(codevs 1163)树形DP

题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的时间,由于经验老道,他拿下一副画需要5秒的时间.你的任务是设计一个程序,计算在警察赶来之前(警察到达时皮尔回到了入口也算),他最多能偷到多少幅画. 输入描述 Input Description 第1行是警察赶到得时间,以s为单位.第2行描述了艺术馆得结构,是一串非负整数,成对

1163 访问艺术馆

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

codvs 1163 访问艺术馆 树状动规

[问题描述] 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer知道每个展室里藏画的数量,并且他精确测量了通过每条走廊的时间.由于经验老到,他拿下一幅画需要5秒的时间.你的任务是编一个程序,计算在警察赶来前 ,他最多能偷到多少幅画. [输入格式] 第1行是警察赶到的时间,以秒为单位.第2行描述了艺术馆的结构,是一串非负整数,成对地出现:每一对的第一个数是走过一条走廊的时间,第2个数是它

codevs1163 访问艺术馆

题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精确地测量了通过每条走廊的时间,由于经验老道,他拿下一副画需要5秒的时间.你的任务是设计一个程序,计算在警察赶来之前(警察到达时皮尔回到了入口也算),他最多能偷到多少幅画. 输入描述 Input Description 第1行是警察赶到得时间,以s为单位.第2行描述了艺术馆得结构,是一串非负整数,成对

访问艺术馆

[题目描述] John打算到艺术馆盗画,在艺术馆里,每条走廊要么分叉为两条走廊,要么通向一个展览室(走廊的数目 <= 100).John知道每个展览室藏画的数量,以及通过每条走廊所用的时间,并且他拿下一副画需要5秒钟的时间. 现询问在警察赶来之前,John最多能够偷到多少幅画. [输入描述] 第一行输入一个数,表示警察赶到的时间S(S <= 600): 第二行输入一行非负整数,每一对数的第一个数表示通过一条走廊所需的时间,第二个数表示其末端的藏画数量,如果第二个数为0,那么说明这条走廊分叉为两