由于不是求最大的可拦截的HP值,而是要将最小值最大化,那么就需要分配每个子树用的钱数以达到最小值最大化

第一步解决如何分配钱使得结点u的子树中用了j元钱后可以拦截的HP最大,这就是变形的分组(依赖)背包,即枚举m元钱,在子树v用t元钱,在v之前的子树用j-t元钱

  用Max[v][j]数组记录u的前v个结点花j元钱可以拦截的最大HP,Max[v][j]=max{min( dp[v][t] , Max[v-i][j-t] )},第一维v可以压缩掉

第二步考虑结点u上建立什么炮塔,用Max数组来求出dp[u][j]即可

/*
给定一棵树,m块钱,每个结点上可以建造k种(价格price,攻击力power)防御塔
求可以阻拦的最大血量
dp[i][j]表示子树i中花费j元可以抵挡的怪物血量 */
#include<bits/stdc++.h>
using namespace std;
#define maxn 1050
struct Edge{int to,nxt;}edge[maxn<<];
struct node{int k,price[],power[];}p[maxn];
int n,m,head[maxn],tot,dp[maxn][],flag[maxn];
void init(){
tot=;
memset(head,-,sizeof head);
memset(flag,,sizeof flag);
}
void addedge(int u,int v){
edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
}
void dfs(int u,int pre){
//init,每个点只能建立一个塔嘛
for(int j=m;j>=;j--)
for(int i=;i<=p[u].k;i++)
if(j>=p[u].price[i])
dp[u][j]=max(dp[u][j],p[u].power[i]); if(flag[u]==&&u!=)return;//叶子节点退出 for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v!=pre)dfs(v,u);
} //Max[i][j]表示给前i个儿子花费j元时可以拦截的最大hp,可压成滚动数组
int Max[];
memset(Max,0x3f,sizeof Max);
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v==pre)continue;
for(int j=m;j>=;j--){//给子树v之前的子树用j元
int maxx=;
for(int t=;t<=j;t++)//给子树v用t元
maxx=max(maxx,min(dp[v][t],Max[j-t]));//找出最优的分配方式
Max[j]=maxx;//记录
}
} //最后Max数组表示给u的子树总共花i元可以拦截的最大HP
for(int j=m;j>=;j--)
for(int t=;t<=j;t++)//给子树花费t,给自己花费j-t元
dp[u][j]=max(dp[u][j],dp[u][j-t]+Max[t]);
//printf("%d\n",u);
//for(int i=1;i<=m;i++)
// printf("%d ",dp[1][i]);
}
int main(){
int t,u,v;
cin>>t;
while(t--){
init();
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
flag[u]++;flag[v]++;
}
scanf("%d",&m);
for(int i=;i<=n;i++){
scanf("%d",&p[i].k);
for(int j=;j<=p[i].k;j++)
scanf("%d%d",&p[i].price[j],&p[i].power[j]);
}
memset(dp,,sizeof dp);
dfs(,);
printf("%d\n",dp[][m]);
}
}

hdu4044 依赖背包变形 好题!的更多相关文章

  1. 依赖背包变形——poj1947(经典)

    /*这题显然不适用依赖背包的优化,因为不能保证根是必选的,但是可以按照常规依赖背包的思路进行转移,即每次对一个儿子进行C^2的转移 还是树形的背包,dp[u][j]表示u的子树里,切割出一个大小为j的 ...

  2. 依赖背包变形(经典)——poj1155

    这个题用优化后的依赖背包做难以实现,所以用常规的泛化物品的和来做即可 每个节点的容量定义为这个节点下的叶子结点个数,dp[u][j]用来表示节点u下选取j个物品的最大收益,最后从m-0查询dp[1][ ...

  3. 依赖背包——cf855C好题

    比较裸的依赖背包,但是想状态还是想了好久 转移时由于边界问题,虽然可以倒序转移,但当容量为0|1的时候,由于有初始值的存在 很难再原dp数组上进行修改,所以额外用tmp数组来保存修改后的值 #incl ...

  4. HDU-4044 树形背包dp好题

    不会做,题解是参考网上的.感觉这道题是到好题,使得我对树形背包dp更了解了. 有几个注意的点,直接给出代码,题解以及注意点都在注释里了. #include<bits/stdc++.h> u ...

  5. 依赖背包变形——hdu4003

    思维性比较强,代码挺简单的,dp[u][j]表示在u子树下安排j个机器人,让其不回u 注意转移时的初始值 /* dp[u][j]为在子树u有j个机器人不回来 */ #include<bits/s ...

  6. hdu 1561 The more, The Better (依赖背包 树形dp)

    题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = ...

  7. cf581F 依赖背包+临时数组 好题

    这题得加个临时数组才能做.. /* 给定一棵树,树节点可以染黑白,要求叶子节点黑白平分 称连接黑白点的边为杂边,求使得杂边最少的染色方 那么设dp[i][j][0|1]表示i子树中有j个叶子节点,i染 ...

  8. 【HDU 4276】The Ghost Blows Light(树形DP,依赖背包)

    The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The t ...

  9. Codeforces Round #214 (Div. 2) C. Dima and Salad (背包变形)

    C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...

随机推荐

  1. constexpr和常量表达式

    常量表达式:值不会改变并且在编译过程就能得到计算结果的表达式. 字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式. 一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同 ...

  2. Oracle 11g 的 自动内存管理

    oracle11g 设置memory_target的值,开启AMM(Auto Memory Management),剩下的Oracle就可以自动维护了 参考:1.https://www.cnblogs ...

  3. ODS、DW和DM

    参考资料: 数据仓库ODS.DW和DM概念区分:https://www.jianshu.com/p/72e395d8cb33

  4. cartographer 分析

    原文链接:http://blog.csdn.net/zyh821351004/article/details/52421005 cartographer与karto的比较 1. 两者采取的都是图优化框 ...

  5. Scrapy快速上手

    超详细官方教程解析 https://blog.csdn.net/fly_yr/article/details/51540269 实战过程: 创建一个Scrapy项目 定义提取的Item 编写爬取网站的 ...

  6. 在Vue中的load或ready的加载时机

    在Vue中的load或ready的加载时机 1.我们来插入一段代码来分析: Js代码如下 <script type="text/javascript"> var app ...

  7. [Jenkins]CentOS7下Jenkins搭建

    最近在倒腾Kubernetes的一些东西,这次需要用到Jenkins来实现自动化构建.来讲一讲搭建的整个过程. Jenkins是什么 Jenkins提供了软件开发的持续集成服务.它运行在Servlet ...

  8. html5离线记事本

    离线记事本 这是一个笔记应用,不需要联网,也不需要数据库,可以直接把数据储存在本地.方便易用! ^_^ <!DOCTYPE html>  <html>  <head> ...

  9. LwIP Application Developers Manual2---Protocols概览

    1.前言 本文是对LwIP Application Developers Manual的翻译 lwIP是模块化的并支持广泛的协议,这些大部分协议可以被裁减从而减小代码的尺寸 2.协议概览 链路层和网络 ...

  10. Mongoose简介

    Mongoose 官网地址:http://mongoosejs.com/   ,Mongoose 为node.js提供了优雅的,针对mongodb的ODM(Object Document Mappin ...