M. Monster Hunter(树形dp)
M. Monster Hunter
才知道原来树形dp是三维的,一直没有学会过,感谢大佬的文章!算法进阶—理解树形背包问题
状态表示:fi,k,j,{0/1}f_{i,k,j,\{0/1\}}fi,k,j,{0/1}以iii为根的子树,考虑到第kkk个儿子时,使用了jjj次魔法,自己是否被魔法干掉的最小花费。
对于第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)相关推荐
- ICPC亚洲区域赛(南京) M.Monster Hunter(树形dp)
LINK 转化题意,把每个点的权值放在自己和父亲上计算 ①.树形背包解法 那么其实这是一个树型dpdpdp的过程 定义f[i][j][0/1]f[i][j][0/1]f[i][j][0/1]表示子树中 ...
- 0x54. 动态规划 - 树形DP(习题详解 × 12)
目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...
- Monster Hunter(2020南京M)
Monster Hunter(2020南京M) 题意: 给你一颗树,树上每个节点都是一个hpi 血量的怪物.打败每个怪物所需要的能量值为hpi + 所 有 存 活 的 直 接 子 节 点 的 hpj ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- [树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
- BZOJ 1040 ZJOI2008 骑士 树形DP
题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
- [NC15748]旅游 树形dp基础
菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...
最新文章
- BERT的成功是否依赖于虚假相关的统计线索?
- 绝了!华为、H3C、锐捷交换机配置命令大全
- 1.1 sikuli 安装
- 黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南
- 牛客题霸 [合并有序链表] C++题解/答案
- 单片机c语言篮球比分_基于单片机的篮球比赛计时计分器的设计
- 安卓开发面试技能介绍,来一份全面的面试宝典练练手,不吃透都对不起自己
- WCF中使用HttpSession
- 阿里、字节年薪百万的测开专家,都在关注哪些前沿技术
- 五大列级庄_酒庄拉菲古堡Chateau Lafite Rothschild, 波尔多五大一级庄之首
- 看程序员如何实力撩妹
- 电子不停车收费系统(ETC)专题(1)——系统概述
- 光盘安装linux系统
- Python自动化运维介绍
- 首席新媒体商学院黎想:全新的抖音涨粉攻略
- 快速将图片背景去掉教程
- Lesson 1. 线性回归模型的一般实现形式
- 【NOIP 2017】Day2 T3 列队
- 如何将计算机管理中的可用空间,怎样增加电脑可用内存
- Java郑轻oj_郑州轻工业大学oj题解(c语言)1037: 四则运算
热门文章
- android byte[] 转string 好多问号_#WIPI# Android使用HID设备
- linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]
- c语言 java 性能 测试_这个蓝桥杯系统的题,用c语言去评测是满分,改为Java说运行错误是0分,但是我查看输入输出,至少第...
- 东南大学计算机网络_东南大学,2020年东南大学高考录取分数线分析
- java 连接池连接mysql数据库需要哪些jar包_DBCP-基于Java8导入DBCP连接池所需JAR包并编写DBCPUtils工具类...
- 索尼android 怎么截屏快捷键,索尼XZ Premium怎么截屏 2种索尼XZ Premium截图方法
- 三菱四节传送带控制梯形图_一文讲透FX5U PLC程序控制指令及步进梯形图编程
- 背包(二维数组版和一维数组版)
- [JavaWeb-JavaScript]JavaScript注释数据类型
- C++ using namespace 命名空间的定义与使用