제출 #1335242

#제출 시각아이디문제언어결과실행 시간메모리
1335242Jawad_Akbar_JJDostavljač (COCI18_dostavljac)C++20
0 / 140
4 ms3396 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 505;
vector<int> nei[N], G[3 * N];
int dp[3 * N][N], cur, val[N * 3], a[N];

void dfs(int u, int p){
	int me = ++cur;
	val[me] = a[u];

	vector<int> in, out;
	for (int i : nei[u]){
		if (i == p)
			continue;
		in.push_back(++cur);
		dfs(i, u);
		out.push_back(++cur);
	}

	for (int i=0;i<in.size();i++){
		G[me].push_back(in[i]);
		for (int j=i+1;j<in.size();j++)
			G[out[i]].push_back(in[j]);
		G[out[i]].push_back(cur + 1);
	}
	G[me].push_back(cur + 1);
}

int main(){
	int n, m, Ans = 0;
	cin>>n>>m;

	for (int i=1;i<=n;i++)
		cin>>a[i];

	for (int i=1;i<n;i++){
		int u, v;
		cin>>u>>v;

		nei[u].push_back(v);
		nei[v].push_back(u);
	}
	dfs(1, 0);

	for (int i=0;i<=cur;i++)
		for (int j=0;j<=m;j++)
			dp[i][j] = -1e9;
	dp[0][0] = 0;

	for (int i=0;i<=cur;i++){
		for (int j=0;j<=m;j++)
			Ans = max(Ans, dp[i][j]);

		G[i].push_back(i + 1);
		for (int k : G[i])
			for (int j=0;j<=m;j++)
				dp[k][j+1] = max(dp[k][j+1], dp[i][j] + val[k]);
	}
	cout<<Ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...