二叉苹果树
Posted lcan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉苹果树相关的知识,希望对你有一定的参考价值。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=107; 6 int map[maxn][maxn],l[maxn],r[maxn],a[maxn],f[maxn][maxn]; 7 int n,q; 8 void buildtree(int u){ 9 for(int i=1;i<=n;i++){ 10 if(map[u][i]!=-1){ 11 l[u]=i;a[i]=map[u][i]; 12 map[u][i]=-1;map[i][u]=-1; 13 buildtree(i); 14 break; 15 } 16 } 17 for(int i=1;i<=n;i++){ 18 if(map[u][i]!=-1){ 19 r[u]=i;a[i]=map[u][i]; 20 map[u][i]=-1;map[i][u]=-1; 21 buildtree(i); 22 break; 23 } 24 } 25 } 26 int DP(int i,int j){ 27 if(j==0) return f[i][j]=0; 28 if(l[i]==0&&r[i]==0) return f[i][j]=a[i]; 29 if(f[i][j]>0) return f[i][j]; 30 for(int k=0;k<=j-1;k++) 31 f[i][j]=max(f[i][j],DP(l[i],k)+DP(r[i],j-k-1)+a[i]); 32 return f[i][j]; 33 } 34 int main(){ 35 cin>>n>>q; 36 memset(map,-1,sizeof(map)); 37 for(int i=1;i<n;i++){ 38 int u,v,w;cin>>u>>v>>w; 39 map[u][v]=w;map[v][u]=w; 40 } 41 buildtree(1); 42 int ans=DP(1,q+1); 43 cout<<ans<<endl; 44 return 0; 45 }
以上是关于二叉苹果树的主要内容,如果未能解决你的问题,请参考以下文章