1017: [JSOI2008]魔兽地图DotR

Time Limit: 30 Sec  Memory Limit: 162 MB
Submit: 1230  Solved: 522
[Submit][Status][Discuss]

Description

DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allstars。DotR里面的英雄只有一个属性——力量。他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄的力量值等于它购买的所有装备的力量值之和。装备分为基本装备和高级装备两种。基本装备可以直接从商店里面用金币购买,而高级装备需要用基本装备或者较低级的高级装备来合成,合成不需要附加的金币。装备的合成路线可以用一棵树来表示。比如,Sange and Yasha的合成需要Sange, Yasha和Sange and Yasha Recipe Scroll三样物品。其中Sange又要用Ogre Axe, Belt of Giant Strength 和 Sange Recipe Scroll合成。每件基本装备都有数量限制,这限制了你不能无限制地合成某些性价比很高的装备。现在,英雄Spectre有M个金币,他想用这些钱购买装备使自己的力量值尽量高。你能帮帮他吗?他会教你魔法Haunt(幽灵附体)作为回报的。

Input

输入文件第一行包含两个整数,N (1 <= n <= 51) 和 m (0 <= m <= 2,000)。分别表示装备的种类数和金币数。装备用1到N的整数编号。接下来的N行,按照装备1到装备n的顺序,每行描述一种装备。每一行的第一个正整数表示这个装备贡献的力量值。接下来的非空字符表示这种装备是基本装备还是高级装备,A表示高级装备,B表示基本装备。如果是基本装备,紧接着的两个正整数分别表示它的单价(单位为金币)和数量限制(不超过100)。如果是高级装备,后面紧跟着一个正整数C,表示这个高级装备需要C种低级装备。后面的2C个数,依次描述某个低级装备的种类和需要的个数。

Output

第一行包含一个整数S,表示最多可以提升多少点力量值。

Sample Input

10 59
5 A 3 6 1 9 2 10 1
1 B 5 3
1 B 4 3
1 B 2 3
8 A 3 2 1 3 1 7 1
1 B 5 3
5 B 3 3
15 A 3 1 1 5 1 4 1
1 B 3 5
1 B 4 3

Sample Output

33

HINT

Source

题意:玩过游戏的都懂,给出一棵树,每个节点都可以由下面的节点按一定数量合成,每个节点可以提供一定力量,孩子节点有数量限制,问用一定金钱,能得到的最大力量

分析:题目很明确,一棵树,一棵树上的Dp,树形DP

状态很容易想Dp[i][j][k] 表示第 i 个点,恰好花去k元其中 必须合成 j 个提供给父亲节点合成用,所能得到的最大力量(不包括提供给父亲的那部分)

转移时维护一个辅助数组F[x][i][j]

表示第 x 个节点,前 i 个孩子, 花去 j 元能获得的最大力量,具体看代码吧,要在枚举提供给父亲节点的数目的前提下计算(废话)

综上所述,本题得解

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <cmath>
  5 #include <deque>
  6 #include <vector>
  7 #include <queue>
  8 #include <iostream>
  9 #include <algorithm>
 10 #include <map>
 11 #include <set>
 12 #include <ctime>
 13 using namespace std;
 14 typedef long long LL;
 15 #define For(i, s, t) for(int i = (s); i <= (t); i++)
 16 #define Ford(i, s, t) for(int i = (s); i >= (t); i--)
 17 #define MIT (2147483647)
 18 #define INF (1000000001)
 19 #define MLL (1000000000000000001LL)
 20 #define sz(x) ((bnt) (x).size())
 21 #define clr(x, y) memset(x, y, sizeof(x))
 22 #define puf push_front
 23 #define pub push_back
 24 #define pof pop_front
 25 #define pob pop_back
 26 #define ft first
 27 #define sd second
 28 #define mk make_pair
 29 inline void SetIO(string Name) {
 30     string Input = Name+".in",
 31     Output = Name+".out";
 32     freopen(Input.c_str(), "r", stdin),
 33     freopen(Output.c_str(), "w", stdout);
 34 }
 35
 36 const int N = 60, M = 2010, Max = 110;
 37 int n, m;
 38 int Root, Dp[N][Max][M], F[N][N][M];
 39 int Fa[N], Need[N][N], Child[N][N], LC[N];
 40 int Power[N], Money[N], Limit[N];
 41 bool Visit[N], Basic[N];
 42
 43 inline void Input() {
 44     scanf("%d%d", &n, &m);
 45     For(i, 1, n) {
 46         scanf("%d", &Power[i]);
 47         char ch = ' ';
 48         while(ch != 'A' && ch != 'B') ch = getchar();
 49         if(ch == 'A') {
 50             scanf("%d", &LC[i]);
 51             For(j, 1, LC[i]) {
 52                 scanf("%d%d", &Child[i][j], &Need[i][j]);
 53                 Visit[Child[i][j]] = 1;
 54             }
 55         } else {
 56             scanf("%d%d", &Money[i], &Limit[i]);
 57             Limit[i] = min(Limit[i], m/Money[i]), Basic[i] = 1;
 58         }
 59     }
 60 }
 61
 62 inline void CalnLimit(int x) {
 63     if(Basic[x]) return;
 64     Limit[x] = INF, Money[x] = 0;
 65     For(i, 1, LC[x]) {
 66         int y = Child[x][i];
 67         CalnLimit(y);
 68         Limit[x] = min(Limit[x], Limit[y]/Need[x][i]);
 69         Money[x] += Money[y]*Need[x][i];
 70     }
 71     Limit[x] = min(Limit[x], m/Money[x]);
 72 }
 73
 74 inline void Search(int x) {
 75     if(Basic[x]) {
 76         For(i, 0, Limit[x])
 77             For(j, i, Limit[x])
 78                 Dp[x][i][j*Money[x]] = (j-i)*Power[x];
 79     } else {
 80         For(i, 1, LC[x]) Search(Child[x][i]);
 81
 82         For(k, 0, Limit[x]) {
 83             For(i, 0, LC[x])
 84                 For(j, 0, m) F[x][i][j] = -INF;
 85             F[x][0][0] = 0;
 86
 87             For(i, 1, LC[x])
 88                 For(j, 0, m)
 89                     For(g, 0, j)
 90                         F[x][i][j] = max(F[x][i][j],
 91                             F[x][i-1][j-g]+Dp[Child[x][i]][k*Need[x][i]][g]);
 92
 93             For(i, 0, k)
 94                 For(g, 0, m)
 95                     Dp[x][i][g] = max(Dp[x][i][g], F[x][LC[x]][g]+Power[x]*(k-i));
 96         }
 97     }
 98 }
 99
100 inline void Solve() {
101     For(i, 1, n)
102         if(!Visit[i]) {
103             Root = i;
104             break;
105         }
106
107     CalnLimit(Root);
108
109     For(i, 1, n)
110         For(j, 0, Limit[i])
111                 For(k, 0, m) Dp[i][j][k] = -INF;
112     Search(Root);
113
114     int Ans = 0;
115     For(i, 0, m) Ans = max(Ans, Dp[Root][0][i]);
116     printf("%d\n", Ans);
117 }
118
119 int main() {
120     SetIO("1017");
121     Input();
122     Solve();
123     return 0;
124 }

View Code

转载于:https://www.cnblogs.com/StupidBoy/p/4614314.html

bzoj1017 [JSOI2008]魔兽地图DotR相关推荐

  1. 【bzoj1017】[JSOI2008]魔兽地图DotR

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 1658  Solved: 755 [Submit] ...

  2. 1017: [JSOI2008]魔兽地图DotR

    Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA  (Defense of the An ...

  3. [bzoj1017]:[JSOI2008]魔兽地图DotR

    传送门 JSOI2008 All Clear! 这个题简直了,我整个代码都是抄的,抄完还是一脸懵逼 我就tm没见过这么难的树形dp 一开始还以为水题,然后发现根本不知道怎么dp 题解还是直接抄hzwe ...

  4. bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】

    bzoj上是一个森林啊--? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来 ...

  5. 【C++】「JSOI-2008」魔兽地图DotR

    「JSOI-2008」魔兽地图DotR [来源] [题目描述] [输入格式] [输出格式] [样例输出] [样例输出] [解析] [代码] [来源] BZOJ-1017 计蒜客-T2793 vjudg ...

  6. 洛谷P4037 [JSOI2008]魔兽地图 题解

    洛谷P4037 [JSOI2008]魔兽地图 题解 题目链接:P4037 [JSOI2008]魔兽地图 题意: DotR (Defense of the Robots) Allstars是一个风靡全球 ...

  7. [BZOJ]1017 魔兽地图DotR(JSOI2008)

    BZOJ第一页做着做着就能碰到毒题,做到BZOJ1082小C就忍了,没想到下一题就是这种东西.这种题目不拖出来枭首示众怎么对得起小C流逝的青春啊. Description DotR (Defense ...

  8. [JSOI2008]魔兽地图(树形dp)

    DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allst ...

  9. [BZOJ1017][树形DP][背包DP]JSOI2008:魔兽地图DotR

    BZOJ1017 每个装备可以直接贡献,也可以用于合成 设 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示第 i i i件装备, j j j件用于合成,花费 k ...

最新文章

  1. java中位与运算符_Java中位运算符和的区别
  2. DOM对象和JQUERY对象
  3. jmeter服务器性能资源监控部署
  4. webservice的原理及概念
  5. jqgrid实现客户端导出Excel、txt、word、json等数据格式的文件
  6. javascript监听键盘事件 - 如表单enter回车提交
  7. Uncaught SyntaxError: Unexpected identifier异常
  8. 对于数据,科技小白提出了灵魂三问:从哪儿来?到哪儿去?能干什么?
  9. 大数据学习笔记29:Hadoop压缩机制演示
  10. python爬虫实践目的_Python编写爬虫实践
  11. JS获取DropDownList的value值与text值
  12. FreeSwitch Event Socket Command(事件套接字命令行)
  13. python信用评分卡建模
  14. 从源码分析HashSet集合
  15. ibatis iterator list 参数 查询
  16. wd移动硬盘不能识别_wd移动硬盘读不出来怎么办
  17. Xaml技术:浅析为什么说一个标签就是new一个对象?
  18. 02 汇编语言的函数
  19. Linux内核是什么?Linux内核是怎么工作的?
  20. php高可用高安全,PHP开发高可用高安全App后端-学客谷 - Powered by Discuz!

热门文章

  1. 测试一下你的杀毒软件
  2. 第二次网页前端培训(HTML表单)
  3. 雷神之战html5游戏在线玩,雷神之战_雷神之战变态版_雷神之战无限元宝/钻石公益服_VR之家...
  4. c#OleDbConnection 类和DbConnection
  5. 如何在服务器上使用Jupyter-简易版
  6. KeyFinder 快速破解AES密钥
  7. 股份授权证明(DPOS)概述
  8. SOM(Kohonen)
  9. Window应急响应(六 ARP病毒)
  10. 真三轴循环加卸载作用下塑性滞回环面积计算与煤岩能量耗散曲线绘制