记录编号 597517 评测结果 AAAAAAAAAA
题目名称 外卖 最终得分 100
用户昵称 Gravatar小金 是否通过 通过
代码语言 C++ 运行时间 0.353 s
提交时间 2024-11-28 19:47:17 内存使用 4.28 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m,a[510],tot,h[510],v[1010],ne[1010],f[510][510][2],siz[510],ans;
  4. void add(int x,int y)
  5. {
  6. tot++;
  7. v[tot]=y;
  8. ne[tot]=h[x];
  9. h[x]=tot;
  10. }
  11. void dp(int x,int fa)
  12. {
  13. siz[x]=1;
  14. f[x][1][0]=a[x];
  15. f[x][1][1]=a[x];
  16. for(int i=h[x];i;i=ne[i])
  17. {
  18. int y=v[i];
  19. if(y==fa) continue;
  20. dp(y,x);
  21. siz[x]+=siz[y];
  22. for(int j=m;j;j--)
  23. {
  24. for(int k=1;k<j;k++)
  25. {
  26. if(j-k-2>=0)
  27. {
  28. f[x][j][0]=max(f[x][j][0],f[y][k][0]+f[x][j-k-2][0]);
  29. f[x][j][1]=max(f[x][j][1],f[y][k][0]+f[x][j-k-2][1]);
  30. }
  31. f[x][j][1]=max(f[x][j][1],f[y][k][1]+f[x][j-k-1][0]);
  32. }
  33. }
  34. }
  35. }
  36. int main()
  37. {
  38. freopen("food.in","r",stdin);
  39. freopen("food.out","w",stdout);
  40. scanf("%d%d",&n,&m);
  41. for(int i=1;i<=n;i++)
  42. {
  43. scanf("%d",&a[i]);
  44. }
  45. for(int i=1;i<n;i++)
  46. {
  47. int x,y;
  48. scanf("%d%d",&x,&y);
  49. add(x,y);
  50. add(y,x);
  51. }
  52. dp(1,0);
  53. for(int i=1;i<=m;i++)
  54. {
  55. ans=max(ans,max(f[1][i][0],f[1][i][1]));
  56. }
  57. printf("%d",ans);
  58. return 0;
  59. }