2 2 1 2 30 3 10 20 20 40 30 50 3 10 30 20 40 30 45 4 2 1 3 1 1 4 60 3 10 20 20 40 30 50 3 10 30 20 40 30 45 3 10 30 20 40 30 35 3 10 30 20 40 30 35
70 80
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1010; 4 const int INF = 0x3f3f3f3f; 5 using PII = pair<int,int>; 6 vector<int>g[maxn]; 7 int dp[maxn][210],hp[maxn][210],n,m; 8 void dfs(int u,int fa) { 9 if(u > 1 && g[u].size() == 1) { 10 for(int i = 0; i <= m; ++i) 11 dp[u][i] = hp[u][i]; 12 return; 13 } 14 for(int i = g[u].size()-1; i >= 0; --i) { 15 if(g[u][i] == fa) continue; 16 dfs(g[u][i],u); 17 for(int j = m; j >= 0; --j) { 18 int tmp = 0; 19 for(int k = 0; k <= j; ++k) 20 tmp = max(tmp,min(dp[u][j-k],dp[g[u][i]][k])); 21 dp[u][j] = tmp; 22 } 23 } 24 for(int j = m; j >= 0; --j) 25 for(int k = 0; k <= j; ++k) 26 dp[u][j] = max(dp[u][j],dp[u][j-k] + hp[u][k]); 27 } 28 int main() { 29 int kase,u,v; 30 scanf("%d",&kase); 31 while(kase--) { 32 scanf("%d",&n); 33 for(int i = 0; i <= n; ++i) g[i].clear(); 34 memset(dp,0x3f,sizeof dp); 35 memset(hp,0,sizeof hp); 36 for(int i = 1; i < n; ++i) { 37 scanf("%d%d",&u,&v); 38 g[u].push_back(v); 39 g[v].push_back(u); 40 } 41 scanf("%d",&m); 42 for(int i = 1,t; i <= n; ++i) { 43 scanf("%d",&t); 44 while(t--) { 45 scanf("%d%d",&u,&v); 46 hp[i][u] = max(hp[i][u],v); 47 } 48 for(int j = 1; j <= m; ++j) 49 hp[i][j] = max(hp[i][j],hp[i][j-1]); 50 } 51 dfs(1,0); 52 printf("%d\n",dp[1][m]); 53 } 54 return 0; 55 }
原文:http://www.cnblogs.com/crackpotisback/p/4944841.html