【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可以移动白色 ...
随机推荐
- 一个表中的字段值用作另一个表的In查询条件
Question表与Paper表 Paper表中字段QuestionIds存储的是Question表中字段Id的拼接后的值 如: 'f855eba1-b308-4bd7-a250-c071a0e1bd ...
- 折叠表格思路及遇到的问题(tableView:viewForHeaderInSection:的section从1开始,不是从0开始)
项目需要做了一个类似qq联系人的折叠表格,思路很简单:设置每个section的header,在header上显示组名等信息,然后根据折叠与否,设置每个section中cell的数量,如果折叠,则将之设 ...
- mysql 查询锁,解锁语句
一:锁表: 锁定数据表,避免在备份过程中,表被更新 mysql>LOCK TABLES tbl_name READ; 为表增加一个写锁定: mysql>LOCK TABLES tbl_na ...
- c++的set_unexpected不起作用
代码是从:http://www.cplusplus.com/referen ... /?kw=set_unexpected找的 // set_unexpected example #include & ...
- NGUI3.7.4实现循环拖动
前段时间下了NGUI新版本3.7.4,看到例子Endless Scroll Views,实现了循环拖动,可能会用到,先把实现步骤贴出来跟大家分享一下. 1.首先新建一个背景. 2.添加所需控件,类似滑 ...
- 网站真分页js代码该怎么写?
真分页这个词对程序猿们来说,并不是一个陌生的词汇,但是如果你是初次学习真分页,或许还是得花点时间小小研究下,下面是之前去转盘网(喜欢的可以看看,也可以进入引擎模式)的真分页js部分代码,html部分的 ...
- 内部系统间调用client包的封装方法
1.何为client 公司内部的系统调用,如果采用http直接调用,会非常不方便,而且不规范,接口升级或者变动,系统间的改动也是相当麻烦.所以在系统间采用client的互相调用,调用简单,如下: 获取 ...
- Python爬虫学习笔记(一)
1.urllib2简介 urllib2的是爬取URL(统一资源定位器)的Python模块.它提供了一个非常简单的接口,使用urlopen函数.它能够使用多种不同的协议来爬取URL.它还提供了一个稍微复 ...
- 2-XOR-SAT (种类并查集)
写了那么多模拟题这题算是最难的了QAQ 好神,,,我于是补了一下并查集.. 并查集很神...... orz 种类并查集...orz 对于维护sat,我们可以这样想: 如果x和y的xor是true,那么 ...
- Java WEB 之页面间传递特殊字符
本文是学习网络上的文章时的总结以及自己的一点实践.感谢大家无私的分享. 昨天在做项目的时候,有一个页面间传递特殊字符的需求,查了一些资料.如今将自己的经验写出来. 首先.在前台编码 var fckPu ...