P5054 Dostavljač 95分求助!!
  • 板块学术版
  • 楼主0zhouyq
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/2/10 20:28
  • 上次更新2023/10/28 08:59:06
查看原帖
P5054 Dostavljač 95分求助!!
660641
0zhouyq楼主2022/2/10 20:28

题目 代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int home[501];
int f[501];
int ba[501];
int cnt=1;
int n,m;
template<typename zqw>void qr(zqw &x){
	bool f=x=0;
	char c=getchar();
	while(!isdigit(c)) f|=c=='-',c=getchar();
	while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
	x=f?-x:x;
	return ;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9) write(x/10);
	putchar(x%10+48);
}
struct node {
	int next,to;
}e[1000];
inline void putin(int a,int b){
	e[cnt].next=home[a];
	e[cnt].to=b;
	home[a]=cnt++;
}
int dp[501][1001][2];
void hou(int x){
	for (int i=home[x];i!=0;i=e[i].next){
		if(e[i].to!=ba[x]){
			ba[e[i].to]=x;
			hou(e[i].to);
		}
		else continue;
		for(int j=m;j>=0;j--){
			for(int k=m;k>=0;k--){
				if(k + j + 2 <= m) dp[x][j+k+2][0] = max(dp[x][j+k+2][0],dp[x][j][0]+dp[e[i].to][k][1]);
				dp[x][j+k+2][1] = max(dp[x][j+k+2][1],dp[x][j][1]+dp[e[i].to][k][1]);	
				if(k + j + 1 <= m) dp[x][j+k+1][0] = max(dp[x][j+k+1][0],dp[x][j][1]+dp[e[i].to][k][0]);
			}
		}
	}
	for(int i = m;i >= 1;i--) {
		dp[x][i][1] = max(dp[x][i][1],dp[x][i-1][1]+f[x]),
		dp[x][i][0] = max(dp[x][i][0],dp[x][i-1][0]+f[x]);
	}	
}
signed main(){
	qr(n);
	qr(m);
	ba[1]=1;
	for(int i=1;i<=n;i++) qr(f[i]);
	for(int i=1;i<n;i++){
		int a,b;
		qr(a);
		qr(b);
		putin(a,b);
		putin(b,a);
	}
	hou(1);
	write(dp[1][m][0]);
	return 0;
}
2022/2/10 20:28
加载中...