题目: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了...总之注意边界。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=,inf=0x3f3f3f3f;
int n,K,d[xn],ans,f[xn][xn][],mn[xn];
int hd[xn],ct,nxt[xn<<],to[xn<<];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void dfs(int x,int fa)
{
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
dfs(u,x);
}
for(int j=;j<n;j++)
{
if(!j)f[x][j][]=K;
else f[x][j][]=d[j];
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
// for(int k=0;k<n;k++)ret=min(ret,f[u][k][1]);
int ret=min(mn[u],f[u][j+][]);
f[x][j][]+=ret;
}
if(!j)
{
f[x][j][]=K;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
int ret=min(f[u][][],mn[u]);
// for(int k=0;k<n;k++)ret=min(ret,f[u][k][1]);
f[x][j][]+=ret;
}
}
else
{
f[x][j][]=inf;
for(int i=hd[x],v;i;i=nxt[i])
{
if((v=to[i])==fa)continue;
int r=f[v][j-][]+d[j];
for(int l=hd[x],u;l;l=nxt[l])
{
if((u=to[l])==fa||u==v)continue;
int ret=min(f[u][j+][],mn[u]);
// for(int k=0;k<n;k++)ret=min(ret,f[u][k][1]);
r+=ret;
}
f[x][j][]=min(f[x][j][],r);
}
}
mn[x]=min(mn[x],f[x][j][]);
}
}
int main()
{
n=rd(); K=rd();
for(int i=;i<n;i++)d[i]=rd();
for(int i=,x,y;i<n;i++)
{
x=rd(); y=rd();
add(x,y); add(y,x);
}
memset(f,0x3f,sizeof f);
memset(mn,0x3f,sizeof mn);
dfs(,); ans=f[][][];
for(int j=;j<n;j++)ans=min(ans,f[][j][]);
printf("%d\n",ans);
return ;
}

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. [HNOI2009]梦幻布丁(链表+启发式合并)

    洛谷传送门 开始一个O(n^2)思路,每次每句要改变颜色的点,改变完颜色后重新计算颜色的段数,显然拉闸. 然后呢..然后就不会了. 看了别人博客,才知道有个叫做启发式合并的东西,就是把小的合并到大的上 ...

  2. 生物遗传学 整理人PYJ (恋_紫花地丁)

    生物遗传学整理人PYJ (恋_紫花地丁) 高中生物唯一需要数学知识的就是遗传学的概率计算了.这里对简单的遗传学规律做一些总结. 目录: 1.      孟德尔第一定律(分离定律): 2.      孟 ...

  3. 【BZOJ2733】永无乡(线段树,启发式合并)

    题意:支持合并,求块内K小数 对于 100%的数据 n≤100000,m≤n,q≤300000 思路:对于每一个块建立一棵动态开点的线段树,暴力(启发式?)合并后二分下就行了 merge用函数的方式写 ...

  4. 12.1——类的定义与声明,隐含的this指针

    类的定义与声明: (1)将const放在成员函数的形参列表之后,可以将将成员函数声明为常量,而它的意思是函数不能改变所操作的数据成员 这里必须在声明和定义处都加上const. (2)成员函数有一个隐含 ...

  5. 给Ubuntu更换成163的源(sources.list)Unable to locate package

    Refer to http://www.crifan.com/ubuntu_change_sources_list_to_163/ 1. backup /etc/apt/sources.list 2. ...

  6. ThinkPHP __construct和_initialize的使用

    ThinkPHP框架中的__construct和_initialize的使用 父类(PlatformController.class.php): class PlatformController ex ...

  7. solr相关文章

    Solr集群架构概述及delta-import详细配置 背景 由于项目原因,重新熟悉了下Solr,版本为3.6,搭建了主从Solr服务,并使用DIH从RDBMS数据源增量更新索引. 其实也没什么技术含 ...

  8. 从零开始写STL—set/map

    这一部分只要把搜索树中暴露的接口封装一下,做一些改动. set源码剖析 template<typename T> class set { public: typedef T key_typ ...

  9. Java的vector可实现自动增长的数组

    Vector维克多提供了向量类(vector)以实现类似动态数组的功能. 首先,在Java中并没有指针这样的概念 ,但如果正确灵活地使用指针又确实可以大大提高程序的质量.比如在c,c++中所谓的“动态 ...

  10. cocos2dx 制作单机麻将(五)

    cocos2dx 制作单机麻将(五) 麻将逻辑6 最基础的4人麻将逻辑(轮流循环出牌, 之前学的都能用上  跑起来了!!!) 最基础的麻将逻辑 依据自己须要 设置麻将人数GAME_PLAYER 基本流 ...