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

题目描述 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

f[i][j]表示在第i条走廊及其子树上花费j时间能偷到的画的数量

因为在当前走廊上要花费2*a的时间,所以留给子树的时间就只有t-2*a

枚举留给子树的时间i,再枚举其中一颗子树的时间j

f[x][i+2*a]=max{f[l][j]+f[r][i-j]}

如果利用数据本身的DFS顺序,就不用自己再建图了,编程复杂度大大降低

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 int s,sz=0,f[100][601];
 5 int dfs(int t)
 6 {
 7     int a,b,x=sz;
 8     scanf("%d%d",&a,&b);
 9     if (b)
10     {
11         for (int i=0;i<=t-2*a;i++) f[x][i+2*a]=min(i/5,b);
12     }
13     else
14     {
15         int l=++sz;dfs(t-2*a);
16         int r=++sz;dfs(t-2*a);
17         for (int i=0;i<=t-2*a;i++)
18             for (int j=0;j<=i;j++)
19                 f[x][i+2*a]=max(f[x][i+2*a],f[l][j]+f[r][i-j]);
20     }
21 }
22 int main()
23 {
24     scanf("%d",&s);
25     dfs(s);
26     printf("%d",f[0][s]);
27 }
时间: 2024-10-13 07:51:38

【树上动规】【codevs 1163】访问艺术馆的相关文章

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

codvs 1163 访问艺术馆 树状动规

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

1163 访问艺术馆

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

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

codevs1163访问艺术馆(树形dp)

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

访问艺术馆 (Codevs No.1163)

2016-05-31 20:48:47 题目链接: 访问艺术馆 (Codevs No.1163) 题目大意: 一个贼要在一个二叉树结构的艺术馆中偷画,画都处于叶子节点处,偷画和经过走廊都需要时间,求在限定时间内可以偷到最大数量 解法: 树状DP (记忆化搜索实现) DP[i][j]表示到达i节点时还有j的时间来移动可以偷到的最大数量 状态转移: 对于叶子节点,直接按时间剩余返回最大偷画数量 对于非叶子节点,最大值可能来自Lson一边,也可能只来自Rson一边,还有可能是Lson,Rson按某种方

乘积最大——动规不归路

看着方程写的.不多说什么,慢慢学动规. 1 #include<cstdio> 2 #define max(x,y) x>y?x:y 3 const int N=64; 4 long long f[N][8],n,k,val[N]; 5 long long cal(int l,int r){ 6 long long res=0; 7 for(int i=l;i<=r;i++)res=res*10+val[i]; 8 return res; 9 } 10 int main(){ 11

POJ 2955 Brackets (动规)

Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2999   Accepted: 1536 Description We give the following inductive definition of a "regular brackets" sequence: the empty sequence is a regular brackets sequence, if s is a reg

sicily 1091 Maximum Sum (动规)

1 //1091.Maximum Sum 2 //b(i,j) = max{b(i,j-1)+a[j], max(b(i-1,t)+a[j])} (t<j) 3 #include <iostream> 4 using namespace std; 5 6 int main() { 7 int t; 8 cin>>t; 9 while (t--) { 10 int n; 11 cin>>n; 12 int a[n+1]; 13 for (int i = 1; i &