树归~搜城探宝

来源:互联网 发布:mac默认启动系统 编辑:程序博客网 时间:2024/05/06 10:56
[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\]


0 0
原创粉丝点击