题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711

就是树形DP,然而也想了半天才把转移想清楚;

f[x][j][0] 表示 x 去上面 j 步的仓库,f[x][j][1] 表示 x 去子树内下去 j 步的仓库而且整个子树都算好了;

f[x][j][0] 就是 d[j] 加上儿子们的 f[u][...][1] 与 f[u][j+1][0] 的最小值;

f[x][j][1] 就是选一个儿子加它的 f[u][j-1][1],其它儿子是 f[u][...][1] 与 f[u][j+1][0] 的最小值;

f[x][0][1] 要特殊处理一下;

然后一交秒WA,又改了改,似乎也没改什么,就A了...总之注意边界。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. int const xn=,inf=0x3f3f3f3f;
  7. int n,K,d[xn],ans,f[xn][xn][],mn[xn];
  8. int hd[xn],ct,nxt[xn<<],to[xn<<];
  9. int rd()
  10. {
  11. int ret=,f=; char ch=getchar();
  12. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  13. while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  14. return f?ret:-ret;
  15. }
  16. void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
  17. void dfs(int x,int fa)
  18. {
  19. for(int i=hd[x],u;i;i=nxt[i])
  20. {
  21. if((u=to[i])==fa)continue;
  22. dfs(u,x);
  23. }
  24. for(int j=;j<n;j++)
  25. {
  26. if(!j)f[x][j][]=K;
  27. else f[x][j][]=d[j];
  28. for(int i=hd[x],u;i;i=nxt[i])
  29. {
  30. if((u=to[i])==fa)continue;
  31. // for(int k=0;k<n;k++)ret=min(ret,f[u][k][1]);
  32. int ret=min(mn[u],f[u][j+][]);
  33. f[x][j][]+=ret;
  34. }
  35. if(!j)
  36. {
  37. f[x][j][]=K;
  38. for(int i=hd[x],u;i;i=nxt[i])
  39. {
  40. if((u=to[i])==fa)continue;
  41. int ret=min(f[u][][],mn[u]);
  42. // for(int k=0;k<n;k++)ret=min(ret,f[u][k][1]);
  43. f[x][j][]+=ret;
  44. }
  45. }
  46. else
  47. {
  48. f[x][j][]=inf;
  49. for(int i=hd[x],v;i;i=nxt[i])
  50. {
  51. if((v=to[i])==fa)continue;
  52. int r=f[v][j-][]+d[j];
  53. for(int l=hd[x],u;l;l=nxt[l])
  54. {
  55. if((u=to[l])==fa||u==v)continue;
  56. int ret=min(f[u][j+][],mn[u]);
  57. // for(int k=0;k<n;k++)ret=min(ret,f[u][k][1]);
  58. r+=ret;
  59. }
  60. f[x][j][]=min(f[x][j][],r);
  61. }
  62. }
  63. mn[x]=min(mn[x],f[x][j][]);
  64. }
  65. }
  66. int main()
  67. {
  68. n=rd(); K=rd();
  69. for(int i=;i<n;i++)d[i]=rd();
  70. for(int i=,x,y;i<n;i++)
  71. {
  72. x=rd(); y=rd();
  73. add(x,y); add(y,x);
  74. }
  75. memset(f,0x3f,sizeof f);
  76. memset(mn,0x3f,sizeof mn);
  77. dfs(,); ans=f[][][];
  78. for(int j=;j<n;j++)ans=min(ans,f[][j][]);
  79. printf("%d\n",ans);
  80. return ;
  81. }

bzoj 4711 小奇挖矿 —— 树形DP的更多相关文章

  1. 【BZOJ4711】小奇挖矿 树形DP

    [BZOJ4711]小奇挖矿 Description [题目背景] 小奇在喵星系使用了无限非概率驱动的采矿机,以至于在所有星球上都采出了一些矿石,现在它准备建一些矿石仓库并把矿石运到各个仓库里. [问 ...

  2. bzoj 4711 小奇挖矿 ——“承诺”类树形dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 对“承诺”有了更深的了解. 向外和向内要区分,所以 f [ i ][ j ] 表示根向 ...

  3. [BZOJ 4033] [HAOI2015] T1 【树形DP】

    题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...

  4. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

  5. [CSP-S模拟测试]:小奇挖矿2(DP+赛瓦维斯特定理)

    题目背景 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. 题目描述 现在有$m+1$个星球,从左到右标号为$0$到$n$,小奇最初 ...

  6. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

    一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

  7. BZOJ 4557 JLOI2016 侦查守卫 树形dp

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 题意概述: 给出一棵树,每个点付出代价w[i]可以控制距离和它不超过d的点,现在给 ...

  8. 【NOIP模拟赛】小奇挖矿 2

    [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小奇最初在0 ...

  9. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

随机推荐

  1. POJ 2478 欧拉函数打表的运用

    http://poj.org/problem?id=2478 此题只是用简单的欧拉函数求每一个数的互质数的值会超时,因为要求很多数据的欧拉函数值,所以选用欧拉函数打表法. PS:因为最后得到的结果会很 ...

  2. msp430入门编程46

    msp430中C语言的人机交互--基于状态机菜单

  3. msp430入门编程45

    msp430中C语言的人机交互--独占CPU菜单

  4. POJ 2749 2SAT判定+二分

    题意:图上n个点,使每个点都与俩个中转点的其中一个相连(二选一,典型2-sat),并使任意两点最大 距离最小(最大最小,2分答案),有些点相互hata,不能选同一个中转点,有些点相互LOVE,必需选相 ...

  5. 怎么删除"自豪地采用WordPress"

    wordpress刚刚安装完毕,打开默认的主页,会发现底部有这样的一行文字:“自豪地采用WordPress”.当然了,我们做一个网站,不一定需要这些文字,我们可以删除或者修改这些文字.今天,小编就来教 ...

  6. Treasure Hunt--poj1066(最短路加判断线段的关系)

    http://poj.org/problem?id=1066 题目大意:有n条线段 他们都在这个房间里   最后有一个点代表起始位置 现在想通过墙出去  他只能爆破每个房间的中点的门   问最少的门通 ...

  7. [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 673  Solved: 261[Submit][ ...

  8. @Aspect注解无效

    Pointcut的execution配置正确的话,检查下,是否加了以下jar包 <!-- http://mvnrepository.com/artifact/org.aspectj/aspect ...

  9. 海康设备网络SDK 编程

    http://www.cnblogs.com/qtblog/p/5366276.html http://www.hikvision.com/Cn/download_more_401.html

  10. Java静态分派与动态分派(二)

    方法调用并不等于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程. 在程序运行时,进行方法调用是最普遍.最频繁的操作,但是Class文件 ...