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. 分析:问题 ...
随机推荐
- json的学习笔记
json比较简单,所以先从json开始学起. 一 json的名称: json的全称是javascript object notation,中文名称为js 对象表示法. json的定义:json是一种轻 ...
- Android &Swift iOS开发:语言与框架对比
转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...
- java 数组流
Example10_10.java import java.io.*; public class Example10_10 { public static void main(String args[ ...
- cocos2d-x 3.3 显示中文
Resources文件夹下的strings.xml: <dict> <key>targetScore</key> <string>目标分数</st ...
- angular实现select的ng-options
html <div ng-controller="ngSelect"> <select ng-model="vm.selectVal" ng- ...
- 理解free命令
free的输出: total used free shared buffers cached Mem: -/+ buffers/cache: Swap: 第一行: total:总内存 used:已使用 ...
- Bootstrap 模态对话框只加载一次 remote 数据的解决办法 转载
http://my.oschina.net/qczhang/blog/190215 摘要 前端框架 Bootstrap 的模态对话框,可以使用 remote 选项指定一个 URL,这样对话框在第一次弹 ...
- Redis SAVE 命令 返回 ERR
今天使用redis-cli客户端中执行SAVE命令返回 (error) ERR Baidu找不到答案,去Google找一下 应该是redis-server服务没有root权限 然后sudo kill ...
- DNS开源服务器BIND最小配置详解<转>
一,简介 相对于存储和大数据领域,CDN是一个相对小的领域,但行行出状元,BIND就是CDN领域的蝉联N届的状元郎.BIND是一款非常常用的DNS开源服务器,全球有90%的DNS用BIND实现.值得一 ...
- OpenGL------三维变换
我们生活在一个三维的世界——如果要观察一个物体,我们可以:1.从不同的位置去观察它.(视图变换)2.移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它.(模型变换)3.如果把物 ...