BZOJ 1017 魔兽地图DotR(树形DP)

题意:有两类装备,高级装备A和基础装备B。现在有m的钱。每种B有一个单价和可以购买的数量上限。每个Ai可以由Ci种其他物品合成,给出Ci种其他物品每种需要的数量。每个装备有一个贡献值。求最大的贡献值。已知物品的合成路线是一个严格的树模型。即有一种物品不会合成其他任意物品,其余物品都会仅仅可用作合成另外一种物品

思路:f[i][j][k],代表第i个物品,花费了j,向上提供k个i物品。

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 int f[55][2005][105];
 7 int num[20005],a[20005],b[20005],c[105][105],d[105][105];
 8 int n,m,vis[200005],dp[55][2005],w[20005],pd[20005];
 9 void dfs(int x){
10     if (!num[x]){
11         b[x]=std::min(b[x],m/a[x]);
12         for (int i=0;i<=b[x];i++)
13          for (int j=0;j<=i;j++)
14           f[x][i*a[x]][j]=w[x]*(i-j);
15         return;
16     }
17     b[x]=0x7fffffff;
18     for (int i=1;i<=num[x];i++){
19         int pur=c[x][i];
20         dfs(pur);
21         b[x]=std::min(b[x],b[pur]/d[x][i]);
22         a[x]+=d[x][i]*a[pur];
23     }
24     b[x]=std::min(b[x],m/a[x]);
25     for (int t=0;t<=b[x];t++){
26         memset(dp,-0x3f3f3f3f,sizeof dp);
27         dp[0][0]=0;
28         for (int i=1;i<=num[x];i++)
29          for (int j=0;j<=m;j++)
30           for (int k=0;k<=j;k++)
31            dp[i][j]=std::max(dp[i][j],dp[i-1][j-k]+f[c[x][i]][k][t*d[x][i]]);
32         for (int j=0;j<=m;j++)
33          for (int k=0;k<=t;k++)
34           f[x][j][k]=std::max(f[x][j][k],dp[num[x]][j]+(t-k)*w[x]);
35     }
36 }
37 int main(){
38     char s[20];
39     scanf("%d%d",&n,&m);
40     for (int i=1;i<=n;i++){
41         scanf("%d",&w[i]);
42         scanf("%s",s+1);
43         if (s[1]==‘A‘) pd[i]=1;else pd[i]=0;
44         num[i]=0;
45         if (pd[i]==0) {
46           scanf("%d%d",&a[i],&b[i]);
47           num[i]=0;
48           continue;
49         }
50         scanf("%d",&num[i]);
51         for (int j=1;j<=num[i];j++){
52          scanf("%d%d",&c[i][j],&d[i][j]);
53          vis[c[i][j]]=1;
54         }
55     }
56     int i;
57     for (i=1;i<=n;i++) if (!vis[i]) break;
58     int root=i;
59     memset(f,-0x3f3f3f3f,sizeof f);
60     dfs(root);
61     int ans=0;
62     for (int i=0;i<=m;i++)
63      for (int j=0;j<=b[root];j++)
64       ans=std::max(ans,f[root][i][j]);
65     printf("%d\n",ans);
66 }
时间: 2024-11-05 12:32:10

BZOJ 1017 魔兽地图DotR(树形DP)的相关文章

bzoj 1017[JSOI2008]魔兽地图DotR - 树形dp

1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MB Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allstars.DotR里面的英雄只有一个属性--力量.他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄

【East!模拟赛】【Round1】【BZOJ1017】魔兽地图Dotr 树形DP

题意不多说. 曰: 呃,首先显然这是一个树形DP. 然后我不会什么高大上的算法,我只能提供一种非常慢,但是能在BZ切的算法(因为是总时限并且还有O2). 题解: 不需要新建树,这个树就行. 首先这道题一眼就能想到树形背包..但是树形背包怎么做呢? 因为需要合成,所以这里的状态F[i][j][k]并不是i节点有j个花费为k时的最大收益,而是i节点给其父亲j个花费k时的最大收益(不含父亲收益).好吧,这个我自己没想出来,但是或许我可以给你讲讲怎么想出来. 我们考虑这道题有两个难点: 第一个是怎么确定

[JSOI2008][BZOJ1017] 魔兽地图DotR|树形动规

1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1254  Solved: 537[Submit][Status][Discuss] Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allstars.DotR里面的英雄只有一个属性——力

BZOJ [JSOI2008]魔兽地图DotR

1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1243  Solved: 532[Submit][Status][Discuss] Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allstars.DotR里面的英雄只有一个属性——力

BZOJ 1017 魔兽地图

Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allstars.DotR里面的英雄只有一个属性——力量.他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄的力量值等于它购买的所有装备的力量值之和.装备分为基本装备和高级装备两种.基本装备可以直接从商店里面用金币购买,而高级装备需要用基本

【BZOJ 1017】 [JSOI2008]魔兽地图DotR

1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 1069  Solved: 433 [Submit][Status] Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allstars.DotR里面的英雄只有一个属性--力量.他们需要购

BZOJ 2878([Noi2012]迷失游乐园-树形DP+环加外向树+期望DP+vector的erase)

2878: [Noi2012]迷失游乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved: 223 [Submit][Status] Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m只可能等于n或者n-1).小Z现在所在的大门也正好是

[BZOJ 4033] [HAOI2015] T1 【树形DP】

题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Father[i] 之间的边对答案的贡献(比如这条边对黑点对距离和的贡献就是子树内部的黑点数 * 子树外部的黑点数 * 这条边的权值). 然后DFS来求,枚举 i 的每个儿子 j,现在的 f[i][] 是包含了 [1, j-1] 子树,然后两重循环枚举范围是 [1, j - 1] 的子树总 Size 和

bzoj 3566: [SHOI2014]概率充电器 树形DP

首先普及一个概率公式 P(A+B)=P(A)+P(B)-P(AB) 题意:一些充电元件和导线构成一棵树,充电元件是否能充电有2种情况, 1.它自己有qi%的概率充电 2.与它相邻的元件通过导线给它充电(导线有p%的概率导通) 求最终充了电的元件的期望 题解:首先可以将元件能否充电分成3种情况考虑, 1.它自己给自己充好了电 2.它的儿子方向给它传送了电 3.它的父亲方向给它传送了电. 对于1,题目已经给出可以直接赋值, 对于2,可以通过一次树的深度遍历求得.pson[now]=pson[now]