题目大意

一颗根为 \(1\) 的有 \((2≤≤2000)\) 个节点的树,每个节点有一个权值 \(ℎ_{} (1≤ℎ_{}≤10^9)\) ,能删除某个点的前提是其父亲节点已经被删除,并且删除一个节点的费用为 \(ℎ_{}+∑_{∈[]}ℎ_{}\) ,有 \(\) 次使用魔法的机会,每次使用可以免费并且无视限制条件地删去 \(1\) 个节点。分别求出当 \(=0\sim \) 时,删除全部节点所需要的最小花费。

思路

代码

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
#define all(x) x.begin(),x.end()
#define int LL
//#define lc p*2+1
//#define rc p*2+2
#define endl '\n'
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#pragma warning(disable :4996)
const double eps = 1e-8;
const LL mod = 1000000007;
const LL MOD = 998244353;
const int maxn = 2010; int T, N;
vector<int>G[maxn];
int vsize[maxn];
int hp[maxn], dp[maxn][maxn][2]; void add_edge(int from, int to)
{
G[from].push_back(to);
} void dfs(int v)
{
vsize[v] = 1;
dp[v][0][0] = hp[v], dp[v][1][1] = 0;
for (int i = 0; i < G[v].size(); i++)
{
int to = G[v][i];
dfs(to);
for (int j = vsize[v]; j >= 0; j--)
{
for (int k = vsize[to]; k >= 1; k--)
{
if (j < vsize[v])
dp[v][j + k][0] = min(dp[v][j + k][0], dp[v][j][0] + min(dp[to][k][0] + hp[to], dp[to][k][1]));
if (j > 0)
dp[v][j + k][1] = min(dp[v][j + k][1], dp[v][j][1] + min(dp[to][k][0], dp[to][k][1]));
}
dp[v][j][0] += min(dp[to][0][0] + hp[to], dp[to][0][1]);
dp[v][j][1] += min(dp[to][0][0], dp[to][0][1]);
}
vsize[v] += vsize[to];
}
} void solve()
{
dfs(1);
for (int i = 0; i <= N; i++)
{
if (i < N)
printf("%lld ", min(dp[1][i][0], dp[1][i][1]));
else
printf("%lld\n", min(dp[1][i][0], dp[1][i][1]));
}
} signed main()
{
scanf("%lld", &T);
while (T--)
{
//cnt = 0;
scanf("%lld", &N);
for (int i = 0; i <= N; i++)
{
for (int j = 0; j <= N; j++)
dp[i][j][0] = dp[i][j][1] = INF;
}
for (int i = 1; i <= N; i++)
G[i].clear();
int fa;
for (int i = 2; i <= N; i++)
{
scanf("%lld", &fa);
add_edge(fa, i);
}
for (int i = 1; i <= N; i++)
scanf("%lld", &hp[i]);
solve();
} return 0;
}

2020ICPC南京 M.Monster Hunter的更多相关文章

  1. HDU暑假多校第三场H.Monster Hunter

    一.题意 给定一个树状地图,每个树节点上有一只怪物,打死一只怪物的过程中将会消耗A点HP,打死之后将会获得B点HP.因为树状结构,所以每只怪物必须先打死父节点的怪兽之后在打死子节点的怪物.现在,给定每 ...

  2. Day3-A-Problem H. Monster Hunter HDU6326

    Little Q is fighting against scary monsters in the game ``Monster Hunter''. The battlefield consists ...

  3. HDU 6326 Problem H Monster Hunter

    \(\mathtt{Problem H}\) \(\mathtt{Monster}\) \(\mathtt{Hunter}\) \(\mathcal{Description}\) 题目 给定一棵 \( ...

  4. [HDU6326]Monster Hunter(贪心)

    用(a,b)表示一个点先失去a点HP,然后增加b点HP 首先容易证明忽略父亲条件下,任意两个点,先吃b大的最优 对于一个节点v和它的父节点u,若此时选v最优,那么就是吃到u时可以立即吃掉v, 于是可以 ...

  5. [hdu6326]Monster Hunter

    考虑树是以1为中心的菊花图的情况,也即如何安排打怪兽的顺序 用二元组$(a,b)$来描述怪兽,则对于两个怪兽$(a_{1},b_{1})$和$(a_{2},b_{2})$,交换两者不会影响血量的变化量 ...

  6. HDU 6326.Problem H. Monster Hunter-贪心(优先队列)+流水线排序+路径压缩、节点合并(并查集) (2018 Multi-University Training Contest 3 1008)

    6326.Problem H. Monster Hunter 题意就是打怪兽,给定一棵 n 个点的树,除 1 外每个点有一只怪兽,打败它需要先消耗 ai点 HP,再恢复 bi点 HP.求从 1 号点出 ...

  7. 2018 Multi-University Training Contest 3 - HDU Contest

    题解: solution Code: A. Ascending Rating #include<cstdio> const int N=10000010; int T,n,m,k,P,Q, ...

  8. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  9. 2018 Multi-University Training Contest 3 Solution

    A - Problem A. Ascending Rating 题意:给出n个数,给出区间长度m.对于每个区间,初始值的max为0,cnt为0.遇到一个a[i] > ans, 更新ans并且cn ...

随机推荐

  1. golang中map原理剖析

    1. golang中的map有自己的一套实现原理,其核心是由hmap和bmap两个结构体实现的 2.  初始化map package main func main() { // 初始化一个可容纳10个 ...

  2. 如何使用iconfont的CDN

    如何使用iconfont的CDN iconfont作为阿里的图标库,在开发过成功用的已经是非常广泛了,但iconfont并不需要将图标下载后使用,而是可以直接用cdn引入使用,至于使用流程,请看下文. ...

  3. java 中的多线程简单介绍

    package com.zxf.demo; /* * 多线程的实现方式两种? * 一..实现 runnable 接口 * 2.重写run方法 Run():当一个线程启动后,就会自动执行该方法 * 3. ...

  4. Redis集成SpringBoot

    简介 此案例中使用Centos7+redis+SpringBoot. redis安装 https://www.cnblogs.com/xiaofengshan/p/15860447.html 添加依赖 ...

  5. JS Map与Set

    笔记整理自:廖雪峰老师的JS教程 Map JavaScript的对象有个小问题,就是键必须是字符串.但实际上Number或者其他数据类型作为键也是非常合理的. 为了解决这个问题,最新的ES6规范引入了 ...

  6. Git起始操作之设置全局用户名和Email地址

    引自:廖雪峰老师的Git教程 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址.你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无 ...

  7. php7.3编译安装 支持微擎2.0

    再次整理   //一下配置在命令粘贴时注意句尾加 \ , 在 \ 后不能有空格,不然会自动执行,相当于回车./configure --prefix=/usr/local/php \ --with-co ...

  8. Java实现二叉搜索树

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11406176.html 尝试一下用Java实现二叉搜索树/二叉查找树,记录自己的学习历程. 1 ...

  9. LeetCode随缘刷题之无重复字符的最长子串

    欢迎评论区交流. package leetcode.day_12_04; /** * 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度. * <p> * 示例1: * &l ...

  10. Ubuntu service 命令

    启动指定服务 sudo service 服务名 start 停止指定服务 sudo service 服务名 stop 重启指定服务 sudo service 服务名 start 查看所有服务 sudo ...