码迷,mamicode.com
首页 > 其他好文 > 详细

luogu P1270 "访问"美术馆 树dp

时间:2018-11-03 17:38:41      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:org   efi   open   none   时间   splay   ons   https   isp   

传送门

比较奇怪的树形背包

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

然后递归读入就不用建图

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

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

而且不能把时间都用完(导致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 }
View Code

 

luogu P1270 "访问"美术馆 树dp

标签:org   efi   open   none   时间   splay   ons   https   isp   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!