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次魔法,自己是否被魔法干掉的最小花费。

状态转移:
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,k1,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,k1,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!

要加油哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Another Blog

说明&#xff1a; 此博客用于平时做题 但为了整理知识&#xff0c;用博客园来存知识 博客园网址&#xff1a; https://www.cnblogs.com/ssllyf

KubeCon+CloudNativeCon首秀中国!

2018年11月13-15日&#xff0c;全球顶级的Kubernetes官方技术论坛KubeConCloudNativeCon将首次登陆中国&#xff0c;此次活动由云原生计算基金会&#xff08;CNCF&#xff09;主办&#xff0c;在上海跨国采购会展中心隆重举行。KubeCon CloudNativeConKubeConCloudNativeCon 是…

可持久化(一)

参考博客 可持久化数据结构&#xff1a;可以保留每一个历史版本&#xff0c;若所有版本都既可以访问又可以修改&#xff0c;成为完全可持久化&#xff08;可以回滚到某个历史版本&#xff09; 时间线&#xff1a; 可持久化线段树 可持久化下标线段树 题目&#xff1a; 模板…

【模板】高斯消元

ACM模板 目录高斯消元解线性方程组异或方程组bitset优化异或方程组高斯消元解线性方程组 int a[N][N]输入矩阵&#xff0c;nnn行&#xff0c;n1n1n1列&#xff0c;下标从0开始 第n1n1n1列表示方程右边的值&#xff08;n行即n个方程&#xff0c;n列即n个未知数&#xff09; int…

各种模板(数据结构图论)

文章目录数据结构LCT线段树线段树分治树状数组图论Tarjan静态仙人掌最小生成树最短路-Floyd最短路-Dijkstra最短路-Bellman-Ford最短路-SPFA数据结构 LCT #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll lo…

P6620-[省选联考2020A卷]组合数问题【组合数学,斯特林数】

正题 题目链接:https://www.luogu.com.cn/problem/P6620 题目大意 给出n,x,p,mn,x,p,mn,x,p,m和一个mmm次多项式fff求 ∑k0nf(k)xk(nk)\sum_{k0}^nf(k)\times x^k\times \binom{n}{k}k0∑n​f(k)xk(kn​) 答案对ppp取模。 1≤n≤109,1≤m≤10001\leq n\leq 10^9,1\leq m\leq …

ASP.NET Core中使用GraphQL - 第一章 Hello World

前言你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL。 GraphQL提供了一种声明式的方式从服务器拉取数据。你可以从GraphQL官网中了解到GraphQL的所有优点。在这一系列博客中&#xff0c;我将展示如何在ASP.NET Core中集成GraphQL, 并使用GraphQL作为你的API查询语言。…

L2-005 集合相似度 (25分)

L2-005 集合相似度 (25分) 给定两个整数集合&#xff0c;它们的相似度定义为&#xff1a;N​c/N​t​​ 100%。其中N​c 是两个集合都有的不相等整数的个数&#xff0c;N​t是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。 输入格式&#xf…

【模板】EK求最大流、dinic求最大流

ACM模板 目录概念EK算法Dinic算法概念 yxc老师的部分总结 基本概念 1.1 流网络&#xff0c;不考虑反向边 1.2 可行流&#xff0c;不考虑反向边 1.2.1 两个条件&#xff1a;容量限制、流量守恒 1.2.2 可行流的流量指从源点流出的流量 - 流入源点的流量 1.2.3 最大流是指最大可行…

11月7日邀您参加成都微软MVP圆桌之夜!

阅读文本大概需要 3.3 分钟。活动背景/规模成都一座来了就不想离开的城市&#xff0c;在此秋高气爽的日子里&#xff0c;我们迎来了成都微软最有价值专家&#xff08;MVP&#xff09;圆桌之夜。在过去的一年中&#xff0c;感谢各位MVP以杰出的专业知识在技术社区中解决了大量的…

L2-006 树的遍历

给定一棵二叉树的后序遍历和中序遍历&#xff0c;请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&#xff08;≤30&#xff09;&#xff0c;是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中…

各种模板(数学数论字符串)

文章目录数学&数论线性求逆元exgcdexcrtFFTNTT矩阵乘法线性筛素数杜教筛字符串TrieKMPhashManacherAC自动机PAMSAM广义SAM数学&数论 线性求逆元 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll lon…

学习手记(2021/3/19~2022/8/25)

上一篇有点多就开新的了 文章目录树哈希wqswqswqs二分单位根反演威佐夫博弈范德蒙德行列式BEST定理平面图欧拉定理FWT转移矩阵的推导保序回归二分图最大团一些数学小结论范德蒙德卷积乘转加卷积斐波那契前缀和杜教筛μ\muμ单幂转下降幂下降幂X组合数多项式gcd无逆元求行列式&a…

【模板】最大流之上下界可行流

ACM模板 目录无源汇上下界可行流有源汇上下界最大流有源汇上下界最小流无源汇上下界可行流 问题&#xff1a; 给定一个网络&#xff0c;求一个流满足&#xff1a;每条边的流量处在给定的下界和上届[lower,upper]之间&#xff0c;满足流量守恒 首先我们在原网络中确定一个全部是…

Sangmado 公共基础类库

Sangmado&#xff08;发音 /sɔŋmɑːdu:/ ‘桑麻渡’&#xff09;涵盖了支撑 .NET/C# 项目开发的最基础的公共类库&#xff0c;为团队在不断的系统开发和演进过程中发现和积累的最公共的代码可复用单元。Sangmado 公共类库设计原则&#xff1a;独立性&#xff1a;不与任何业务…

牛客挑战赛48E-速度即转发【带修莫队,分块】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出nnn个数字的一个序列&#xff0c;mmm个操作。 给出l,r,kl,r,kl,r,k&#xff0c;求一个最大的xxx使得∑ilrmax{ai−x,0}≥k\sum_{il}^rmax\{a_i-x,0\}\geq k∑ilr​max{ai​−x,0}≥k单点修改 解题思…

L2-002 链表去重

给定一个带整数键值的链表 L&#xff0c;你需要把其中绝对值重复的键值结点删掉。即对每个键值 K&#xff0c;只有第一个绝对值等于 K 的结点被保留。同时&#xff0c;所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15&#xff0c;你需要输出去重后…

【模板】卡特兰数

ACM模板 目录Catalan数证明卡特兰数应用Catalan数证明 1.卡特兰数递推式&#xff1a; an{1,n0∑i0n−1aian−1−i,n>0a_n\begin{cases} 1,n0\\\sum_{i0}^{n-1}a_ia_{n-1-i},n>0\end{cases} an​{1,n0∑i0n−1​ai​an−1−i​,n>0​ 2.卡特兰数组合数&#xff1a; an…

【活动(深圳)DevOps/.NET 微服务 秋季分享会】火热报名中!

无论身处开发还是运维岗位&#xff0c;您一定深刻地感受着业务需求带来的快速交付压力。在科技迅速发展的时代&#xff0c;传统行业积极开展数字化转型以在激烈竞争中脱颖而出&#xff0c;新兴行业不停歇地验证业务模式以找准市场定位&#xff1b;软件与行业变得密不可分&#…

P7443-加边【博弈论】

正题 题目链接:https://www.luogu.com.cn/problem/P7443?contestId41429 题目大意 nnn个点的一棵有根树&#xff0c;两个人从一号点开始进行有向图博弈。 告诉你Alice是先手还是后手&#xff0c;然后你可以选择加一条链接(u,v)(u,v)(u,v)的有向边&#xff0c;权值为AauBavA\…