题目大意

一颗根为 \(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;
}

最新文章

  1. TColor 与 RGB 的转换函数
  2. xcode 7及以上版本网络请求不成功的原因
  3. 【转】Android布局优化之ViewStub
  4. C#中的预处理指令
  5. Struts2 文件上传
  6. robots书写说明:
  7. Office Web addin 踩坑计:替换后台网站为MVC框架时遇到的问题
  8. 使用一年ESB感受
  9. chrome postman插件手动安装
  10. Codeforces543 B. Destroying Roads
  11. 枚举进行位运算 枚举组合z
  12. Spring3.x 版本和 JDK1.8 不兼容导致 java.lang.IllegalStateException: Failed to load ApplicationContext
  13. java之jvm学习笔记十三(jvm基本结构) 通俗易懂的JVM 文件,没有之一
  14. [UE4]动画事件
  15. URL传入带有%的参数的解决方法
  16. BZOJ 1430 小猴打架 - prufer数列
  17. protobuf c++入门
  18. Java 调用 php接口(Ajax)(二)
  19. z-index终结者
  20. python文件目录操作大全

热门文章

  1. Go 指针,标识符命名规范及关键字
  2. IoC容器-Bean管理注解方式(注入属性@Autowired和Qualifier)
  3. 沁恒CH32F103C8T6(二): Linux PlatformIO环境配置, 示例运行和烧录
  4. 学习JAVAWEB第十六天
  5. RTSP实例解析
  6. Ubuntu安装盘的制作
  7. 《Effective TypeScript》条款22 - 类型收缩
  8. Thread中常用API
  9. Idea 中使用Lombok找不到其自动生成的方法
  10. [转载] IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合