【BZOJ4711】小奇挖矿 树形DP
【BZOJ4711】小奇挖矿
Description
Input
Output
Sample Input
2 5 9 11 15 19 20
1 4
1 3
1 7
4 6
2 8
2 3
3 5
Sample Output
【样例解释】
在1,2号星球建立仓库。
题解:前几天做了难么多奇葩的树形DP,然而这题还是没做出来。
n=200,那么应该是个二维或三维的状态。用f[x][y]表示x这个点运到y,并且x子树中的其它点都已经确定了运到哪,且y位置还没建仓库的最小费用。转移方法也是挺神的。
如果我们要用f[a][b]更新f[x][y](其中a是x的儿子),那么有几种情况:
1.b=y,由于我们先不用再y建仓库,所以直接用f[x][y]+f[a][b]更新。
2.b在a的子树中,那么在a的位置建一个即可,所以用f[x][y]+f[a][b]+K更新。
3.b不在a的子树中,这时,我们要么将y改成b,要么将b改成y,一定会使得答案变得更优,所以:不用更新!
最后答案就是min{f[1][x]+K}。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,K,cnt,ans;
int f[210][210],D[210],dep[210],p[210],q[210],head[210],to[410],next[410],fa[210],dis[210][210];
void init(int x)
{
p[x]=++p[0];
for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa[x]) fa[to[i]]=x,dep[to[i]]=dep[x]+1,init(to[i]);
q[x]=p[0];
}
void dfs(int x)
{
f[x][0]=K;
int i,j,k,y;
for(j=1;j<=n;j++) f[x][j]=dis[x][j];
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa[x])
{
y=to[i],dfs(y);
for(j=1;j<=n;j++)
{
int fx=1<<30;
for(k=1;k<=n;k++)
{
if(j==k) fx=min(fx,f[x][j]+f[y][k]);
else if(p[k]>=p[y]&&p[k]<=q[y]) fx=min(fx,f[x][j]+f[y][k]+K);
}
f[x][j]=fx;
}
}
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
inline void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
int main()
{
n=rd(),K=rd();
int i,j,a,b;
for(i=1;i<n;i++) D[i]=rd();
memset(head,-1,sizeof(head));
for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
init(1);
for(i=1;i<=n;i++) for(j=i;j<=n;j++)
{
a=i,b=j;
if(dep[a]<dep[b]) swap(a,b);
while(dep[a]>dep[b]) a=fa[a];
while(a!=b) a=fa[a],b=fa[b];
dis[i][j]=dis[j][i]=D[dep[i]+dep[j]-2*dep[a]];
}
memset(f,0x3f,sizeof(f));
dfs(1);
ans=1<<30;
for(i=1;i<=n;i++) ans=min(ans,f[1][i]);
printf("%d",ans+K);
return 0;
}
【BZOJ4711】小奇挖矿 树形DP的更多相关文章
- bzoj 4711 小奇挖矿 —— 树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 就是树形DP,然而也想了半天才把转移想清楚: f[x][j][0] 表示 x 去上面 ...
- BZOJ4711 小奇挖矿
Description [题目背景] 小奇在喵星系使用了无限非概率驱动的采矿机,以至于在所有星球上都采出了一些矿石,现在它准备建一些矿石仓 库并把矿石运到各个仓库里. [问题描述] 喵星系有n个星球, ...
- [CSP-S模拟测试]:小奇挖矿2(DP+赛瓦维斯特定理)
题目背景 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. 题目描述 现在有$m+1$个星球,从左到右标号为$0$到$n$,小奇最初 ...
- 【NOIP模拟赛】小奇挖矿 2
[题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小奇最初在0 ...
- NOIP模拟赛(by hzwer) T1 小奇挖矿
[题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定 路线依次飞过喵星系的 n 个星球. [问题描述] 星球分为 2 类:资源型和维修型. 1. 资源型:含矿物质量 ...
- 2.17NOIP模拟赛(by hzwer) T1 小奇挖矿
[题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值 w)的飞船,按既定 路线依次飞过喵星系的 n 个星球. [问题描述] 星球分为 2 类:资源型和维修型. 1. 资源型:含矿物质量 ...
- NKOJ4270 小奇挖矿2
问题描述 [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小 ...
- bzoj 4711 小奇挖矿 ——“承诺”类树形dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 对“承诺”有了更深的了解. 向外和向内要区分,所以 f [ i ][ j ] 表示根向 ...
- BZOJ2281[Sdoi2011]黑白棋&BZOJ4550小奇的博弈——DP+nimk游戏
题目描述 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色不同. 小A可以移动白色 ...
随机推荐
- 产品经理PM
首先希望大家记住的就是,千万不要以为产品经理是什么高大上的光环,产品经理其实只是一种状态,一种心态而已. 大家可能看到BAT每年都会从校园里面招聘一些产品经理,尤其是我们腾讯,声称以产品为王,每年投产 ...
- ubuntu下创建.net core时出现 Failed to create prime the NuGet cache
https://docs.microsoft.com/en-us/aspnet/core/getting-started 根据微软给出的文档运行第一个web程序出现错误 Failed to creat ...
- 百度地图和高德地图坐标系的互相转换 四种Sandcastle方法生成c#.net帮助类帮助文档 文档API生成神器SandCastle使用心得 ASP.NET Core
百度地图和高德地图坐标系的互相转换 GPS.谷歌.百度.高德坐标相互转换 一.在进行地图开发过程中,我们一般能接触到以下三种类型的地图坐标系: 1.WGS-84原始坐标系,一般用国际GPS纪录仪记 ...
- Java编程介绍
原文地址:http://happyshome.cn/blog/java/introduction.html 本文介绍的编程基础知识很Java适合刚開始学习的人. 要学习编程,你须要了解编程语言的语法和 ...
- [k8s]简单启动一个k8s集群
简单启动一个k8s集群 kube-master mkdir -p /root/logs/api-audit /root/logs/controller /root/logs/scheduler kub ...
- 简单说一下 servlet的生命周期?
1.servlet有良好的生存期的定义,包括加载和实例化.初始化.处理请求以及服务结束.这个生存期由 javax.servlet.Servlet接口的 init,service和 destroy ...
- 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚
@Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings @Transactional(pr ...
- mongdb复制集搭建
可参考官网教程 复制集增加了数据的冗余同时也提高了mongodb的可靠性,相比传统的主从架构,mongodb具有自动容灾的特性,即主库挂掉后会自动从剩下的从库中选举出一个节点做为主库(不需要人工干预) ...
- js版in_array函数
//检测数组中是否存在某个字符串 function in_array(search,array){ for(var i in array){ if(array[i]==search){ return ...
- Android.mk介绍
Secrets of Android.mk Intro to Android.mk Simple example NDK Usage Defining Modules Simple APK APK D ...