[IOI2005]河流】的更多相关文章

题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄——名叫Bytetown. 在Byteland国,有n个伐木的村庄,这些村庄都座落在河边.目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料.木料被砍下后,顺着河流而被运到Bytetown的伐木场.Byteland的国王决定,为了减少运输木料的费用,再额外地建造k个伐木场.这k个伐木场将…
题目:https://www.luogu.org/problemnew/show/P3354 虽说是几个月前曾经讲过的题,但没有题解而自己(花了两个多小时)A了好高兴!!! 这是一个很好的套路:“承诺”以算值. 伐木场放在哪里对于节点的值是有影响的,所以自然的思路就是把和该节点有关的伐木场位置也压进状态里,对于不同的状态算出不同的值: 也就是“承诺”那些伐木场会放在哪里. 相同的承诺之间才能转移. 这样就有了一个问题:该节点的“承诺”记录的是该节点上方的下一个伐木场在哪:但是该节点放不放伐木场对…
Description Luogu3354 Solution 一道树形dp的题. 首先考虑转移,很简单,就是这个点做不做伐木场.为了方便转移,我们定义状态为\(f_{i,j,k}\)表示点\(i\)及其兄弟的子树中,选了\(k\)个伐木场,且\(j\)是点\(i\)的父亲中距离点\(i\)最近的那个伐木场,这时的总花费. 转移就比较好写了: \[ f_{i,j,k} = min\{ f_{son_i, j, l} + f_{bro_i, j, k-l} + w_i * dis_{i, j} \}…
1.        资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.        资源问题2------01背包问题F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]); 3.        线性动态规划1-----朴素最长非降子序列F:=max{f[j]+1} 4.        剖分问题1-----石子合并F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]); 5.        剖分问题2-----多…
1.        资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.        资源问题2 ------01背包问题   F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]); 3.        线性动态规划1 -----朴素最长非降子序列   F:=max{f[j]+1} 4.        剖分问题1 -----石子合并 F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]); 5.       …
题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫Bytetown. 在Byteland国,有n个伐木的村庄,这些村庄都座落在河边.目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料.木料被砍下后,顺着河流而被运到Bytetown的伐木场.Byteland的国王决定,为了减少运输木料的费用,再额外地建造k个伐木场.这k个伐木场将…
BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\(i\)及\(i\)子树一共建了\(k\)个伐木场.\(0/1\)表示点\(i\)是否建了伐木场. 发现对于\(i\)的子树里的点\(v\),\(v\)建没建伐木场无所谓,需要的是它建了多少.所以DP完\(i\)后,\(i\)只保留\(f[i]...[0/1]\)中较小的一个作为点\(i\)的答案即可…
题目大意: 给定n个点的有根树,每条边有边权,每个点有点权w, 你要在k个点上建立伐木场,对于每个没有建伐木场的点x,令与它最近的祖先.有伐木场的点,为y,你需要支付dis(x,y)*w[x]的代价. 选择合适的位置建伐木场,最小化总代价. n<=100 分析: f[i][j][k]表示, 以i为根的子树中,离其最近的祖先为j,加上这个点的子树共建了k个伐木场. 树形背包,每个点选择建伐木场,或者不选择建. 注意,无论如何,在x子树y回溯后,是可以在子树根节点y造一个伐木场的.这种情况不要漏掉.…
正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就是个树型dp嘛,关键是怎么设状态 首先肯定是想到设f[i][j]:以i为根的子树中选了j个点 这个时候发现布星昂,这么设的时候我们不能得到对于到根的路径上的点的贡献鸭,所以就考虑加一维 所以f[i][j][k]:以i为根的子树中选了j个点,最近祖先的距离为k的最大代价 然后直接转移就好 对了还要说一…
树形dp,设f[i][j][k]表示第i个点的子树中选择j个点作为伐木场,而且k是建了伐木场的最浅的i的祖先的情况下,最小的收益. 这种题还要练一下,咕咕 然后转移可以n4方做. // luogu-judger-enable-o2 #include<bits/stdc++.h> #define il inline #define vd void typedef long long ll; il int gi(){ int x=0,f=1; char ch=getchar(); while(!i…