由于不是求最大的可拦截的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. sqoop导数据

    1.添加oracle  jdbc驱动 https://blog.csdn.net/eason_oracle/article/details/76836758 2.

  2. P5239 回忆京都

    题目地址:P5239 回忆京都 杨辉三角即组合数的"打表"形式 再求一个二维前缀和 然后处理一下负数即可(因为在求前缀和的过程中有减法) #include <bits/std ...

  3. css3实现不同进度条

    进度条类型1(渐变进度条) 效果1:图片实现进度条 思路,进度条是一张图片,用定位来控制不同时间图片相对进度条box的left值来控制位置,用animate实现动画效果 html <div cl ...

  4. 节流(Throttling)和去抖(Debouncing)详解

    这篇文章的作者是 David Corbacho,伦敦的一名前端开发工程师.之前我们有一篇关于”节流”和”去抖”的文章:The Difference Between Throttling and Deb ...

  5. 004_strace工具

    strace - trace system calls and signals 一.strace工具详解 之前线上主机上8351 进程夯死导致无法获悉进程信息,监控程序使用ps 命令查看进程信息至/p ...

  6. centos6.5中部署Zeppelin并配置账号密码验证

    centos6.5中部署Zeppelin并配置账号密码验证1.安装JavaZeppelin支持的操作系统如下图所示.在安装Zeppelin之前,你需要在部署的服务器上安装Oracle JDK 1.7或 ...

  7. WebSocket参考

    websocker是一种网页和服务端建立tcp全双工通信的技术,可以不再让页面进行向服务器发送轮询请求. 需要注意使用的场景,如果建立的tcp过多的话,会对服务器有很大压力. WebSocket前后台 ...

  8. mysql 5.6 windows 启动脚本

    2018-4-25 17:02:08 星期三 下载mysql 5.6 zip(免安装版)到本机 一台电脑上可能装有多个版本的mysql, 启动时为了不影响: 1. 解压后文件夹根目录改名为 mysql ...

  9. Light OJ 1012

    经典搜索水题...... #include<bits/stdc++.h> using namespace std; const int maxn = 20 + 13; const int ...

  10. Vue-cli 搭建web服务介绍

    Node.js 之 npm 包管理 - Node.js 官网地址:点我前往官网 - Node.js 中文镜像官网: 点我前往```` Node.js 是一个基于 Chrome V8 引擎的 JavaS ...