HDU 4044 GeoDefense
树形DP,和背包差不多。dp[now][x]表示now这个节点的子树上,花费为x的时候,获得的最大防御能力(保证敌方HP<=0)
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std; const int maxn = + ;
int T, n, m;
vector<int>tree[maxn];
struct kind
{
int price;
int power;
kind(int a, int b){ price = a; power = b; }
};
vector<kind>v[maxn];
bool vis[maxn];
int dp[maxn][ + ];
int flag[ + ], tmp[ + ]; void init()
{
for (int i = ; i <= n; i++) tree[i].clear();
for (int i = ; i <= n; i++) v[i].clear();
memset(vis, , sizeof vis);
memset(dp, -, sizeof dp);
} void read()
{
scanf("%d", &n);
for (int i = ; i <= n - ; i++)
{
int u, v;
scanf("%d%d", &u, &v);
tree[u].push_back(v);
tree[v].push_back(u);
}
scanf("%d", &m); for (int i = ; i <= n; i++)
{
int ki;
scanf("%d", &ki);
while (ki--)
{
int pricei, poweri;
scanf("%d%d", &pricei, &poweri);
kind k(pricei, poweri);
v[i].push_back(k);
}
}
} void dfs(int now)
{
bool fail = ;
for (int i = ; i<tree[now].size(); i++)
if (!vis[tree[now][i]]) fail = ; if (fail)
{
for (int i = ; i<v[now].size(); i++)
dp[now][v[now][i].price] = max(dp[now][v[now][i].price], v[now][i].power);
return;
} bool d[maxn];
memset(d, , sizeof d);
for (int i = ; i<tree[now].size(); i++)
{
if (vis[tree[now][i]]) continue; int id = tree[now][i];
vis[id] = ; dfs(id); d[i] = ;
} memset(flag, -, sizeof flag); bool first = ; for (int i = ; i<tree[now].size(); i++)
{
if (!d[i]) continue; int id = tree[now][i]; if (first)
{
first = ;
for (int j = ; j <= m; j++) flag[j] = dp[id][j];
} else
{
memset(tmp, -, sizeof tmp);
for (int j = ; j <= m; j++)
for (int k = ; k <= m; k++)
if (dp[id][j] != - && flag[k] != - && j + k <= m)
tmp[j + k] = max(tmp[j + k], min(dp[id][j], flag[k]));
for (int j = ; j <= m; j++) flag[j] = tmp[j];
}
} for (int i = ; i<v[now].size(); i++)
for (int j = m; j >= v[now][i].price; j--)
if (flag[j - v[now][i].price] != -)
dp[now][j] = max(dp[now][j], flag[j - v[now][i].price] + v[now][i].power); for (int i = ; i <= m; i++) dp[now][i] = max(dp[now][i], flag[i]); for (int i = ; i<v[now].size(); i++)
dp[now][v[now][i].price] = max(dp[now][v[now][i].price], v[now][i].power);
} void work()
{
vis[] = ;
dfs();
int ans = ;
for (int i = ; i <= m; i++) ans = max(ans, dp[][i]);
printf("%d\n", ans);
} int main()
{
scanf("%d", &T);
while (T--)
{
init();
read();
work();
}
return ;
}
HDU 4044 GeoDefense的更多相关文章
- HDU 4044 GeoDefense(动态规划)
GeoDefense Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)
题目链接:hdu-4044 题意 这是一个塔防游戏,地图是一个n个编号为1-n的节点的树, 节点1是敌人的基地,其他叶子节点都是你的基地. 敌人的基地会源源不断地出来怪兽,为了防止敌人攻进你的基 ...
- HDU 4044 GeoDefense (树形DP,混合经典)
题意: 给一棵n个节点的树,点1为敌方基地,叶子结点都为我方阵地.我们可以在每个结点安放炸弹,每点至多放一个,每个结点有ki种炸弹可选,且每种炸弹有一个花费和一个攻击力(1点攻击力使敌人掉1点hp). ...
- hdu 4044 树形DP 炮台打怪 (好题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题目大意:给定n个节点组成的树,1为敌方基地,叶子结点为我方结点.我们可以在每个结点安放炮台,至 ...
- hdu 4044 2011北京赛区网络赛E 树形dp ****
专题训练 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm ...
- 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- 基础树形DP小结
HDU 4044 Geodefense http://blog.csdn.net/zmx354/article/details/25109897 树形DP暂且先告一段落了. HDU 3586 Info ...
- 树上的DP
CF#196B http://codeforces.com/contest/338/problem/B 题意:在一颗树上,给m个点,求到所有m个点距离不超过d的点的个数,所有路径长度为1. 分析:问题 ...
随机推荐
- ReactiveCocoa的冷信号与热信号 探讨
背景 ReactiveCocoa(简称RAC)是最初由GitHub团队开发的一套基于Cocoa的FRP框架.FRP即Functional Reactive Programming(函数式响应式编程), ...
- JS-DOM元素灵活查找
用className选择元素 封装成函数 <title>无标题文档</title> <script> /* window.onload=function () { ...
- 5--OC--构造方法
// Created by Stephen on 16/3/2.// Copyright © 2016年 Stephen. All rights reserved.//// 回顾上一章节Perso ...
- 动态规划之----我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
利用动态规划,一共有n列,若从左向右放小矩形,有两种放置方式: 第一种:横着放,即占用两列.此时第二行的前两个空格只能横着放,所有,总的放置次数变为1+num(2*(n-2)),其中2*(n-2)代表 ...
- MySQL 建表
SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for ` ...
- js实现类似于add(1)(2)(3)调用方式的方法
群里有人说实现类似add(1)(2)(3)调用方式的方法,结果马上有人回答: var add = function(a){ return function(b){ return function(c) ...
- AngularJs: Reload page
<a ng-click="reloadRoute()" class="navbar-brand" title="home" data- ...
- 【摘自网络】dll库和lib库有什么区别
简单地讲:第一:.DLL是动态链接库,而.LIB是静态链接库dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, 如 ...
- Regionals 2010 :: NEERC Eastern Subregional
遇到的问题:题目看错...(TAT英语渣渣没办法) 这里具体就讲一些思想和trick ①A题遇到了公式里面的单位问题. ②E题就是变量初始化忘记了 ③J题就是分情况讨论,实际上没有那么难...(题目读 ...
- css 10 款非常棒的CSS代码格式化工具推荐
http://www.iteye.com/news/23692/ 10 款非常棒的CSS代码格式化工具推荐 2011-12-14 09:31 by 副主编 wangguo 评论(0) 有9111人浏 ...