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. 分析:问题 ...
随机推荐
- Python定制类
https://docs.python.org/3/reference/datamodel.html#special-method-names
- Got Stucked in C++ Static Library Loading.. for some time
I used to load library using 1 single .dll file, so when I happen to do method calling between 2 pro ...
- mysql 时间字段的一些问题
MySQl中有多种表示日期和时间的数据类型.其中YEAR表示年份,DATE表示日期,TIME表示时间,DATETIME和TIMESTAMP表示日期和实践.它们的对比如下: YEAR ,字节数为1,取值 ...
- js管理内存
数据不再有用时,最好通过将其值置NULL来释放其引用-这个做法叫做解除引用(dereference).这个做法适用于全局变法和全局对象的属性. function createPerson(name){ ...
- Mysql笔记4数据表操作1
1查看表的结构 (1)show create table +数据库名称 (2)desc+数据库名称 2修改表 (1)表中添加列 alter table 数据库名称 add column addr va ...
- foo bar的意思
有些朋友问:foo, bar是什么意思, 为什么C++书籍中老见到这个词. 我google了一下, 发现没有很好的中文答案.这个问题,在维基百科上有很好的回答.在这里翻译给大家. 译文: 术语foob ...
- 【转】php缓冲 output_buffering和ob_start
原文: http://blog.csdn.net/21aspnet/article/details/7389427 php缓冲 output_buffering和ob_start buffer buf ...
- CentOS 修改Mysql的root密码
1.知道密码 第一次登陆(无密码) mysqladmin -u root password NEWPASSWORD 修改过密码 mysqladmin -u root -p 'oldpassword' ...
- (转)mahout中k-means例子的运行
首先简单说明下,mahout下处理的文件必须是SequenceFile格式的,所以需要把txtfile转换成sequenceFile.SequenceFile是hadoop中的一个类,允 ...
- PAT (Advanced Level) 1068. Find More Coins (30)
01背包路径输出. 保证字典序最小:从大到小做背包. #include<cstdio> #include<cstring> #include<cmath> #inc ...