ICPC2020南京M.Monster
写在前面
大概是高中退役之后第一次写写题解,当然要从基础写起,因为变得更菜了,所以只能写写更水的题目了
题目链接
题解
f(i,j,k)节点i 当前节点是否存活 i及子树内的节点存活数 该状态的所以需要的最小能量值
代码
#include<bits/stdc++.h>
#define rep(a,b,c) for(int a = b;a <= c; ++ a)
#define pc putchar
#define gc getchar()
#define LL long long
using namespace std;
inline int read() {
int x = 0;
char c = gc;
while(c < '0' || c > '9') c = gc;
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc;
return x;
}
const LL INF = 1e18;
const int maxn = 4007;
int n,m;
LL p[maxn],hp[maxn];
vector<int>son[maxn];
LL f[maxn][2][maxn]; //x alive remain
//if fa d son a no
//if fa a son d no
//if fa d son d no
//if son a fa a yes
int sonsize[maxn];
void dfs(int x) {
int k = son[x].size();
f[x][0][0] = 0;
f[x][1][1] = hp[x];
sonsize[x] = 1;
for(int i = 0; i < k;++ i) {
int v = son[x][i];
dfs(v);
int kk = son[v].size();
for(int j = sonsize[x];j >= 0;-- j)
for(int k = sonsize[v];k >= 0 ; -- k) {
f[x][1][j + k] = std::min(f[x][1][j + k],f[x][1][j] + min(f[v][0][k],f[v][1][k] + hp[v]));
f[x][0][j + k] = std::min(f[x][0][j + k],f[x][0][j] + min(f[v][0][k],f[v][1][k]));
}
sonsize[x] += sonsize[v];
}
}
int main() {
int T = read();
while(T --) {
n = read();
rep(i,1,n)son[i].clear();
rep(i,1,n) rep(j,0,n) f[i][0][j] = f[i][1][j] = INF;
for(int i = 2;i <= n; ++ i) { p[i] = read();son[p[i]].push_back(i); }
rep(i,1,n) hp[i] = read();
dfs(1);
for(int i = n;i >= 0;-- i) {
printf("%lld ",std::min(f[1][1][i],f[1][0][i]));
}
puts("");
}
}
/*
3
5
1 2 3 4
1 2 3 4 5
9
1 2 3 4 3 4 6 6
8 4 9 4 4 5 2 4 1
12
1 2 2 4 5 3 4 3 8 10 11
9 1 3 5 10 10 7 3 7 9 4 9
*/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡