[code]
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
struct dd{
int left,right,ok;
}jie[25];
int n,m,f[25][25][3],v[25],a,b,maxn;
void dp(int);
int main(){
memset(f,-0x3f,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=1;i<n;++i)
{
scanf("%d%d",&a,&b);
if(!jie[a].ok)
{
jie[a].left=b;
jie[a].ok=1;
}
else
jie[a].right=b;
}
for(int i=1;i<=n;++i)
scanf("%d",&v[i]);
dp(1);
//maxn=max(f[1][m][0],f[1][m][1]);
printf("%d",maxn);
}
void dp(int x){
//if(!jie[x].left&&!jie[x].right)
{
f[x][1][0]=v[x];
f[x][0][1]=v[x];
f[x][0][0]=0;
//return;
}
if(jie[x].left)
dp(jie[x].left);
else
return;
if(jie[x].right)
dp(jie[x].right);
else
{
for(int i=0;i<=m;++i){
f[x][i][0]=f[jie[x].left][i-1][0]+v[x];
f[x][i][1]=max(f[jie[x].left][i][1],(f[jie[x].left][i-1][1]+v[x],f[jie[x].left][i][0]+v[x]));
}
return;
}
for(int i=0;i<=m;++i)
{
int ans1=-0x3fffffff;
int ans2=-0x3fffffff;
for(int j=0;j<=i;++j){
ans1=max(ans1,f[jie[x].left][j][0]+f[jie[x].right][i-j][0]);
if(i-j-1>=0){
ans1=max(ans1,f[jie[x].left][j][0]+f[jie[x].right][i-j-1][1]);
ans1=max(ans1,f[jie[x].left][j][1]+f[jie[x].right][i-j-1][0]);
ans2=max(ans2,f[jie[x].left][j][0]+f[jie[x].right][i-j-1][0]);
}
}
f[x][i][0]=ans2+v[x];
f[x][i][1]=max(max(f[jie[x].left][i][1],ans1+v[x]),f[jie[x].right][i][1]);
maxn=max(max(maxn,f[x][i][1]),f[x][i][0]);
}
}
[code\]
树归~搜城探宝
最新推荐文章于 2018-03-09 10:00:10 发布