树形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的更多相关文章

  1. HDU 4044 GeoDefense(动态规划)

    GeoDefense Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)

    题目链接:hdu-4044 题意 这是一个塔防游戏,地图是一个n个编号为1-n的节点的树, 节点1是敌人的基地,其他叶子节点都是你的基地.    敌人的基地会源源不断地出来怪兽,为了防止敌人攻进你的基 ...

  3. HDU 4044 GeoDefense (树形DP,混合经典)

    题意: 给一棵n个节点的树,点1为敌方基地,叶子结点都为我方阵地.我们可以在每个结点安放炸弹,每点至多放一个,每个结点有ki种炸弹可选,且每种炸弹有一个花费和一个攻击力(1点攻击力使敌人掉1点hp). ...

  4. hdu 4044 树形DP 炮台打怪 (好题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题目大意:给定n个节点组成的树,1为敌方基地,叶子结点为我方结点.我们可以在每个结点安放炮台,至 ...

  5. hdu 4044 2011北京赛区网络赛E 树形dp ****

    专题训练 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm ...

  6. 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】

    树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...

  7. 【DP_树形DP专题】题单总结

    转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...

  8. 基础树形DP小结

    HDU 4044 Geodefense http://blog.csdn.net/zmx354/article/details/25109897 树形DP暂且先告一段落了. HDU 3586 Info ...

  9. 树上的DP

    CF#196B http://codeforces.com/contest/338/problem/B 题意:在一颗树上,给m个点,求到所有m个点距离不超过d的点的个数,所有路径长度为1. 分析:问题 ...

随机推荐

  1. Spring Boot 系列教程8-EasyUI-edatagrid扩展

    edatagrid扩展组件 edatagrid组件是datagrid的扩展组件,增加了统一处理CRUD的功能,可以用在数据比较简单的页面. 使用的时候需要额外引入jquery.edatagrid.js ...

  2. linux 进程命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  3. xntp的配置

    ntpdate以一种非常粗暴的方式一次性完成设置时钟.由于实时时钟飘移,你需要周期性的矫正.基本上可以通过设置一个cron例行任务来运行ntpdate,但是你的机器从此就不能是ntp服务器了. 相反, ...

  4. acm课程练习2--1003

    题目描述 My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a numb ...

  5. 学习笔记——门面模式Facade

    门面模式,其实在我们不经意间已经使用了此设计模式.当我们需要将两个子系统,合并对外提供一个大的接口时,我们使用的就是门面模式.对外,子系统的接口是不可见的,只有我们的门面在.

  6. java工程开发之图形化界面之(第一课)

    下面我们先上代码: package 一个事例图形小应用程序; import javax.swing.JApplet; import java.awt.Graphics; public class 绘制 ...

  7. android使用support的ActionBar时遇到的问题

    多从网上下载好了support library之后,把android-support-v7-appcompat.jar放到了libs目录下,并加入到了编译路径,本以为万事大吉,可是却报了下面的一个错误 ...

  8. 关于MyEclipse6.5 总是弹出 Update Progress(xx-xx-xx时间)的问题

    退出myeclispe 删除D:\Program Files\MyEclipse 6.0\eclipse\configuration\org.eclipse.update目录下的 last.confi ...

  9. CentOS 6.5添加163源

    1.首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS ...

  10. Eclipse开发Maven项目提示:程序包org.junit不存在解决方案

    原因: 个人考虑产生此错误的原因是因为Eclipse中对于测试和开发的鉴定不明?Intellij中没有错误,因为Intellij对项目的管理就是同Maven结构的. 解决方案: 原来的junit的sc ...