hihoCoder week12 刷油漆
阿新 • • 發佈:2018-11-20
題目連結: https://hihocoder.com/contest/hiho12/problem/1
給出一棵樹 每個節點的價值
求以1為根的樹中,選取m個相聯通的節點的最大價值和
#include <bits/stdc++.h> using namespace std; const int N = 110; int n, m, V[N]; int dp[N][N]; // 以i為根 個數為m的最大價值 bool vis[N]; vector<int> G[N]; void dfs(int u) { vis[u] = true; memset(dp[u],0, sizeof(dp[u])); dp[u][1] = V[u-1]; for(int i=0; i<G[u].size(); i++) { int v = G[u][i]; if(vis[v]) continue; dfs(v); for(int j=m; j>1; j--) { for(int k=1; k<j; k++) { dp[u][j] = max(dp[u][j], dp[u][j-k] + dp[v][k]); } } } }int main() { scanf("%d %d", &n, &m); for(int i=0; i<n; i++) scanf("%d", &V[i]); for(int i=1; i<n; i++) { int u, v; scanf("%d %d", &u, &v); G[v].push_back(u); G[u].push_back(v); } memset(vis, 0, sizeof(vis)); dfs(1); printf("%d\n", dp[1][m]); return 0; }