苹果树(多维树形dp)

 1 /*************************************************************************
 2   > Author: Henry Chen
 3   > Mail: 390989083@qq.com 
 4   > Created Time: 涓? 8/26 21:33:15 2020
 5  ************************************************************************/
 6 #include<bits/stdc++.h>
 7 using namespace std;
 8 int dp[110][210][2];
 9 int val[110];
10 vector<int>vec[110];
11 int n,k;
12 void dfs(int u,int fa)
13 {
14     //printf("dfs %d
",u);
15     for(int i = 0;i < vec[u].size();i++)
16     {
17         int v = vec[u][i];
18         if(v == fa) continue;
19         dfs(v,u);
20         for(int j = k;j >= 0;j--)
21         {
22             for(int p = 0;p <= j;p++)
23             {
24                 if(p-2 >= 0)
25                 {
26                     dp[u][j][1] = max(dp[u][j][1],dp[u][j-p][1]+dp[v][p-2][1]);
27                 }
28                 if(p-1 >= 0)
29                 {
30                     dp[u][j][0] = max(dp[u][j][0],dp[u][j-p][1]+dp[v][p-1][0]);
31                 }
32                 if(p-2 >= 0)
33                 {
34                     dp[u][j][0] = max(dp[u][j][0],dp[u][j-p][0]+dp[v][p-2][1]);
35                 }
36             }
37         }
38     }
39 }
40 int main()
41 {
42     memset(dp,0,sizeof(dp));
43     cin >> n >> k;
44     for(int i = 1;i <= n;i++)
45     {
46         scanf("%d",&val[i]);
47     }
48     for(int i = 1;i < n;++i)
49     {
50         int u,v;
51         scanf("%d%d",&u,&v);
52         vec[u].push_back(v);
53         vec[v].push_back(u);
54     }
55     for(int i = 1;i <= n;i++)
56     {
57         for(int j = 0;j <= k;j++)
58         {
59             dp[i][j][0] = dp[i][j][1] = val[i];
60         }
61     }
62     dfs(1,1);
63     cout << max(dp[1][k][0],dp[1][k][1]) << endl;
64     return 0;
65 }
3 2
0 1 2
1 2
1 3

输出

复制
2
原文地址:https://www.cnblogs.com/mzyy1001/p/13574477.html