P2015 二叉苹果树

辣鸡题面

这题目确实是比较经典的树形dp,里面确实还是有很多需要理解的地方

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1005;
 4 
 5 int n,q;
 6 int dis[N][N],l[N],r[N],a[N],f[N][N];
 7 
 8 int get(){
 9     char zy=getchar();
10     int z=1,y=0;
11     while(zy>'9'||zy<'0'){
12         if(zy=='-')z=-1;
13         zy=getchar();
14     }
15     while(zy>='0'&&zy<='9'){
16         y=y*10+zy-'0';
17         zy=getchar();
18     }
19     return z*y;
20 }
21 
22 void build(int u){
23     for(int i=1;i<=n;i++){
24         if(dis[u][i]>=0){
25             if(!l[u]){
26                 a[i]=dis[u][i];
27                 dis[u][i]=dis[i][u]=-1;
28                 l[u]=i;
29                 build(i);
30                 continue;
31             }
32             a[i]=dis[u][i];
33             dis[u][i]=dis[i][u]=-1;
34             r[u]=i;
35             build(i);
36             break;
37         }
38     }
39 }
40 
41 int Max(int a,int b){return a>b?a:b;}
42 
43 int tdp(int u,int t){
44     if(t==0) return 0;
45     if(l[u]==0&&r[u]==0)return a[u];
46     if(f[u][t])return f[u][t];
47     for(int i=0;i<t;i++){
48         f[u][t]=Max(f[u][t],tdp(l[u],i)+tdp(r[u],t-i-1)+a[u]);
49     }
50     return f[u][t];
51 }
52 
53 int main(){
54     n=get();q=get()+1;
55     for(int i=1;i<=n;i++){
56         for(int j=1;j<=n;j++){
57             dis[i][j]=-1;
58         }
59     }
60     for(int i=1;i<n;i++){
61         int u=get(),v=get();
62         dis[u][v]=dis[v][u]=get();
63     }
64     build(1);
65     printf("%d
",tdp(1,q));
66     return 0;
67 }
原文地址:https://www.cnblogs.com/hahaha2124652975/p/11243493.html