luogu P1270 "访问"美术馆 树dp

传送门

比较奇怪的树形背包

首先需要处理读入的问题 这题史诗递归读入

然后递归读入就不用建图

这题特点是只有叶子有价值 所以背包就不太有用

坑点就是这个人进去还得出来...

而且不能把时间都用完(导致75)

Time cost: 35min

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<queue>
 6 #define ms(a,b) memset(a,b,sizeof a)
 7 #define rep(i,a,n) for(int i = a;i <= n;i++)
 8 #define per(i,n,a) for(int i = n;i >= a;i--)
 9 #define inf 2147483647
10 using namespace std;
11 typedef long long ll;
12 typedef double D;
13 #define eps 1e-8
14 ll read() {
15     ll as = 0,fu = 1;
16     char c = getchar();
17     while(c < ‘0‘ || c > ‘9‘) {
18         if(c == ‘-‘) fu = -1;
19         c = getchar();
20     }
21     while(c >= ‘0‘ && c <= ‘9‘) {
22         as = as * 10 + c - ‘0‘;
23         c = getchar();
24     }
25     return as * fu;
26 }
27 //head
28 const int N = 1005;
29 int n,V;
30 struct node {
31     int val,cst;
32 }p[N<<4];
33 int dp[N][N];
34
35 #define ls x<<1
36 #define rs x<<1|1
37 void input(int x) {
38     p[x].cst = read() << 1,p[x].val = read();
39     if(!p[x].val) input(ls),input(rs);
40 }
41
42 int dfs(int x,int tot) {
43     if(!tot) return 0;
44     if(dp[x][tot]) return dp[x][tot];
45     //sn
46     if(p[x].val) return dp[x][tot] = min(p[x].val,(tot - p[x].cst) / 5);
47     //pa
48     rep(k,0,tot - p[x].cst)
49         dp[x][tot] = max(dp[x][tot],dfs(ls,k) + dfs(rs,tot - p[x].cst - k));
50     return dp[x][tot];
51 }
52
53 int main() {
54     int V = read() - 1;
55     input(1);
56     printf("%d\n",dfs(1,V));
57     return 0;
58 }

原文地址:https://www.cnblogs.com/yuyanjiaB/p/9901122.html

时间: 2024-08-29 16:02:45

luogu P1270 "访问"美术馆 树dp的相关文章

洛谷 P1270 “访问”美术馆(树形DP)

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

P1270 “访问”美术馆(树形dp)

P1270 “访问”美术馆 艺术馆最多有100个展室 ------> 节点数$<=100*2<2^{8}=256$ 所以可以开一个$f[i][j]$表示到第$i$个点为止花去$j$分钟的最大价值 对于分叉的点,我们可以直走右边或直走左边,也可以两边都走一次,分别转移即可. 对于展室(叶节点),处理一下几分钟能拿几幅画. 因为要折返所以边权$*2$,并且总时间花费要严格小于deadline,所以总时间-1 #include<iostream> #include<cstdi

luogu P2700 逐个击破 树dp

传送门 好题啊 给定边权树 求隔离所有指定点的最小花费 考虑树dp的话 自然想到 f[x]表示子树内处理完从根节点出发没有敌人的最小花费 g[x]表示子树内处理完从根节点出发仍有敌人的最小花费 这个时候仍然合法() 又显然根节点是否有敌人是有影响的 所以分类讨论 首先子树没有敌人不用考虑 I. 根节点有敌人的话 f[x]就是inf g[x]直接取f[v]和g[v]+cst[i]最小值 表示是否切x->v这条边 II. 如果根节点没有 那么g[x]维护的就是选择一个花费最小的儿子切 而这样的花费就

luogu P2607 [ZJOI2008] 骑士 树dp

传送门 又一个没有上司的舞会 这个dp有环 妈妈怎么办啊 要不...环上随便断一条边? 然后最后选的时候分别取两个根节点不选的情况的最大值 几个要点: 1.图可能是多个环套树 要循环走完 2.不能只记录顶点 因为如果有重边的话会把二元环筛掉 3.位运算优先级... 要写成(i^1)==cntline Time cost inf 这题从上周就开始D 一度放弃 今天想整一下以前做过的所有题然后就 就写出来啦!!(开心) Code: (边界写的比较奇怪 是Debug的时候被吓怕了) 1 #includ

luogu1270 “访问”美术馆 树形dp

传送门 树形dp f[i][j] - 到i号点,已经j时间了的最大偷画数 #include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, b) for(int i = a; i <= b; ++i) const int N = 107; const int S = 607; int s, n, f[N][S]; void dfs(int u) { int time, paint;

P1270 “访问”美术馆

一道树形dp啦~~~ 其实我是做过这道题的加强版后才做的这道题--不过先由浅入深,先发这个~ 首先,我定义 f [ u ] [ i ] 为在第 u 个点上,给它时间为 i 是能获取的最大价值. 有一个需要注意,如果说这是一个展厅,设给这个点的时间为 t ,那么实际能偷画的时间只有 t - 双倍边权. 这也导致了如果这个点是一个分支,那么我给两边的时间和(就是我给这个点的时间)必定要大于等于二倍边权. 这样就避免了在dfs里传入无关的冗杂的变量,使得状态统一比较容易维护. 接下来贴代码: #inc

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

【BZOJ】1040: [ZJOI2008]骑士 环套树DP

[题意]给定n个人的ai和bi,表示第i个人能力值为ai且不能和bi同时选择,求能力值和最大的选择方案.n<=10^6. [算法]环套树DP(基环树) [题解]n个点n条边--基环森林(若干环套树子图). 若原图是树,经典DP做法:f[i][0/1]表示i点选或不选的最大能力值和,则f[i][0]=Σmax{f[j][0],f[j][1]},f[i][1]=Σf[j][0]+a[i],j=son[i]. 找环:dfs到访问过的点,标记环上的一条边. 破环:和普通树上DP唯一的区别是,标记边两端不

2010辽宁省赛 NBUT 1222 English Game【字典树+DP】

[1222] English Game 时间限制: 1000 ms 内存限制: 131072 K 链接:Click Here! 问题描述 This English game is a simple English words connection game. The rules are as follows: there are N English words in a dictionary, and every word has its own weight v. There is a wei