M. Monster Hunter

才知道原来树形dp是三维的,一直没有学会过,感谢大佬的文章!算法进阶—理解树形背包问题

状态表示:fi,k,j,{0/1}f_{i,k,j,\{0/1\}}fi,k,j,{0/1}​以iii为根的子树,考虑到第kkk个儿子时,使用了jjj次魔法,自己是否被魔法干掉的最小花费。

状态转移:
fi,k,a+b,0=fi,k−1,a,0+min⁡(fv,cnt,b,0+av,fv,cnt,b,1)f_{i,k,a+b,0}=f_{i,k-1,a,0}+\min(f_{v,cnt,b,0}+a_{v},f_{v,cnt,b,1})fi,k,a+b,0​=fi,k−1,a,0​+min(fv,cnt,b,0​+av​,fv,cnt,b,1​)
fi,k,a+b,1=fi,k−1,a,1+min⁡(fv,cnt,b,0,fv,cnt,b,1)f_{i,k,a+b,1}=f_{i,k-1,a,1}+\min(f_{v,cnt,b,0},f_{v,cnt,b,1})fi,k,a+b,1​=fi,k−1,a,1​+min(fv,cnt,b,0​,fv,cnt,b,1​)

对于第2维,可以使用滚动数组优化掉,然后就变成了常见的树形dp模式

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pli;
typedef pair<int,int> pii;
const ll mod=1e9+7;
const int N=2010;
int h[N],e[N],ne[N],idx;
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
ll f[N][2][N][2];
ll a[N];
int sz[N],cnt[N];
int n;
// f[i][k][j][0/1] 以i为根的子树,前k个儿子,使用了j次魔法,i节点是否使用魔法的最小化代价
void dfs(int u)
{   f[u][0][0][0]=a[u];f[u][0][1][1]=0;sz[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int son=e[i];dfs(son);cnt[u]++;for(int j=0;j<=sz[u];j++)f[u][cnt[u]&1][j][1]=f[u][cnt[u]&1][j][0]=1e18;for(int j=0;j<=sz[u];j++)for(int k=0;k<=sz[son];k++){f[u][cnt[u]&1][j+k][1]=min(f[u][cnt[u]&1][j+k][1],f[u][cnt[u]-1&1][j][1]+f[son][cnt[son]&1][k][0]);f[u][cnt[u]&1][j+k][1]=min(f[u][cnt[u]&1][j+k][1],f[u][cnt[u]-1&1][j][1]+f[son][cnt[son]&1][k][1]);f[u][cnt[u]&1][j+k][0]=min(f[u][cnt[u]&1][j+k][0],f[u][cnt[u]-1&1][j][0]+f[son][cnt[son]&1][k][0]+a[son]);f[u][cnt[u]&1][j+k][0]=min(f[u][cnt[u]&1][j+k][0],f[u][cnt[u]-1&1][j][0]+f[son][cnt[son]&1][k][1]);}sz[u]+=sz[son];}
}
int main()
{int T;cin>>T;while(T--){idx=0;cin>>n;for(int i=0;i<=n;i++) sz[i]=0,cnt[i]=0,h[i]=-1;for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)f[i][0][j][0]=f[i][1][j][0]=f[i][0][j][1]=f[i][1][j][1]=1e18;for(int i=2;i<=n;i++){int p;cin>>p;add(p,i);}for(int i=1;i<=n;i++) cin>>a[i];dfs(1);for(int i=0;i<=n;i++)cout<<min(f[1][cnt[1]&1][i][0],f[1][cnt[1]&1][i][1])<<' ';cout<<'\n';}
}

经过这道题,自己对树形dp有了一个重新的认识,明天多做几个树形dp干翻树形dp!

要加油哦~

M. Monster Hunter(树形dp)相关推荐

  1. ICPC亚洲区域赛(南京) M.Monster Hunter(树形dp)

    LINK 转化题意,把每个点的权值放在自己和父亲上计算 ①.树形背包解法 那么其实这是一个树型dpdpdp的过程 定义f[i][j][0/1]f[i][j][0/1]f[i][j][0/1]表示子树中 ...

  2. 0x54. 动态规划 - 树形DP(习题详解 × 12)

    目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...

  3. Monster Hunter(2020南京M)

    Monster Hunter(2020南京M) 题意: 给你一颗树,树上每个节点都是一个hpi 血量的怪物.打败每个怪物所需要的能量值为hpi + 所 有 存 活 的 直 接 子 节 点 的 hpj ...

  4. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  5. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  6. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  7. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  8. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  9. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

最新文章

  1. BERT的成功是否依赖于虚假相关的统计线索?
  2. 绝了!华为、H3C、锐捷交换机配置命令大全
  3. 1.1 sikuli 安装
  4. 黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南
  5. 牛客题霸 [合并有序链表] C++题解/答案
  6. 单片机c语言篮球比分_基于单片机的篮球比赛计时计分器的设计
  7. 安卓开发面试技能介绍,来一份全面的面试宝典练练手,不吃透都对不起自己
  8. WCF中使用HttpSession
  9. 阿里、字节年薪百万的测开专家,都在关注哪些前沿技术
  10. 五大列级庄_酒庄拉菲古堡Chateau Lafite Rothschild, 波尔多五大一级庄之首
  11. 看程序员如何实力撩妹
  12. 电子不停车收费系统(ETC)专题(1)——系统概述
  13. 光盘安装linux系统
  14. Python自动化运维介绍
  15. 首席新媒体商学院黎想:全新的抖音涨粉攻略
  16. 快速将图片背景去掉教程
  17. Lesson 1. 线性回归模型的一般实现形式
  18. 【NOIP 2017】Day2 T3 列队
  19. 如何将计算机管理中的可用空间,怎样增加电脑可用内存
  20. Java郑轻oj_郑州轻工业大学oj题解(c语言)1037: 四则运算

热门文章

  1. android byte[] 转string 好多问号_#WIPI# Android使用HID设备
  2. linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]
  3. c语言 java 性能 测试_这个蓝桥杯系统的题,用c语言去评测是满分,改为Java说运行错误是0分,但是我查看输入输出,至少第...
  4. 东南大学计算机网络_东南大学,2020年东南大学高考录取分数线分析
  5. java 连接池连接mysql数据库需要哪些jar包_DBCP-基于Java8导入DBCP连接池所需JAR包并编写DBCPUtils工具类...
  6. 索尼android 怎么截屏快捷键,索尼XZ Premium怎么截屏 2种索尼XZ Premium截图方法
  7. 三菱四节传送带控制梯形图_一文讲透FX5U PLC程序控制指令及步进梯形图编程
  8. 背包(二维数组版和一维数组版)
  9. [JavaWeb-JavaScript]JavaScript注释数据类型
  10. C++ using namespace 命名空间的定义与使用