UNAC 95pts 求助
  • 板块P8564 ρars/ey
  • 楼主RDFZchenyy
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/1 22:52
  • 上次更新2023/11/2 23:59:30
查看原帖
UNAC 95pts 求助
567610
RDFZchenyy楼主2023/9/1 22:52

link:https://www.luogu.com.cn/record/123518186

#include<bits/stdc++.h>
using namespace std;

#define MAXN 5005
int n,ru,rv;
int siz[MAXN];
long long f[MAXN],dper[MAXN][MAXN];

vector<int> so[MAXN];

void dp(int fa,int u){
	dper[u][0]=0;
	for(auto v:so[u]){
		if(v==fa){
			continue;
		}
		dp(u,v);
		for(int del=1;del<=siz[v]-1;del++){
			for(int up=siz[u];up>=0;up--){
				int un=up+del;
				dper[u][un]=min(dper[u][un],dper[u][up]+dper[v][del]);
			}
		}
		siz[u]+=siz[v];
	}
	for(int i=1;i<=siz[u];i++){
		int lft=siz[u]-i;
		dper[u][siz[u]]=min(dper[u][siz[u]],dper[u][lft]+f[i]);
	}
	siz[u]++;
	
	return;
}

int main(){
	memset(dper,0x3f,sizeof(dper));
	
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++){
		scanf("%lld",&f[i]);
	}
	for(int i=1;i<=n-1;i++){
		scanf("%d %d",&ru,&rv);
		so[ru].push_back(rv);
		so[rv].push_back(ru);
	}
	dp(0,1);
	printf("%lld\n",dper[1][n-1]);
	
	return 0;
}
2023/9/1 22:52
加载中...