BZOJ1812: [Ioi2005]riv(树形dp)】的更多相关文章

题意 题目链接 Sol 首先一个很显然的思路是直接用\(f[i][j] / g[i][j]\)表示\(i\)的子树中选了\(j\)个节点,该节点是否选的最小权值.但是直接这样然后按照树形背包的套路转移的话会有一种情况无法处理,就是说该节点不选,儿子节点也不选,这样我们就不清楚儿子节点的子节点的贡献了 一种暴力的做法是钦定该节点选,并重新枚举子树中的所有节点,转移出dp值之后背包合并 最后再把\(0\)号节点的合并一次 #include<bits/stdc++.h> #define chmin(…
[BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄——名叫Bytetown 在Byteland国,有n个伐木的村庄,这些村庄都座落在河边.目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料.木料被砍下后,顺着河流而被运到Bytetown的伐木场.Byteland的国王决定,为了…
树背包, 左儿子右兄弟来表示树, dp(x, y, z)表示结点x, x的子树及x的部分兄弟共建y个伐木场, 离x最近的伐木场是z时的最小代价. 时间复杂度O(N^2*K^2) ------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>   using namespace s…
BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄——名叫Bytetown 在Byteland国,有n个伐木的村庄,这些村庄都座落在河边.目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料.木料被砍下后,顺着河流而被运到Bytetown的伐木场.Byteland的国王…
riv 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫Bytetown 在Byteland国,有n个伐木的村庄,这些村庄都座落在河边.目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料.木料被砍下后,顺着河流而被运到Bytetown的伐木场.Byteland的国王决定,为了减少运输木料的费用,再额外地建造k个伐木场.这k个伐木场将被建…
题目链接 problem 给出一棵树,每个点有点权,每条边有边权.0号点为根,每个点的代价是这个点的点权\(\times\)该点到根路径上的边权和. 现在可以选择最多K个点.使得每个点的代价变为:这个点的点权\(\times\)改点到最近的被选中的一个祖先的边权和. 问所有点的代价和最小为多少. solution 用\(g[i][j]\)表示以i为根的子树,强制选i,最大的贡献(这里的贡献是指比什么也不选所减少的代价.) 最终答案肯定就是初始代价-g[0][k] 考虑怎么维护出\(g\).用\(…
riv bzoj-1812 IOI-2006 题目大意:给定一棵n个点树,要求在上面建立k个收集站.点有点权,边有边权,整棵树的代价是每个点的点权乘以它和它的最近的祖先收集站的距离积的和. 注释:$1\le n \le 100$,$1\le k \le 50$. 想法:显然,这是一道树形dp题.状态也非常容易... ...只不过,我们好像要枚举子集... 所以,我们这里有一个黑科技:多叉树转二叉树. 我们先把它转成二叉树,然后再进行转移即可. 状态:dp[i][j][k]表示以i为根的子树中选出…
说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕: 题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心. 题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法,没法对照一下,难受啊. 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define LL long long int n,K; ; const LL inf=3…
题目:https://www.luogu.org/problemnew/show/P3354 状态中要记录一个“承诺”,只需相同承诺之间相互转移即可: 然后就是树形DP的套路了. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; ],ct,siz[],fa[],len[]; ll ed[],f[][][][];//点…
1812: [Ioi2005]riv Time Limit: 10 Sec Memory Limit: 64 MB Submit: 635 Solved: 388 [Submit][Status][Discuss] Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫Bytetown 在Byteland国,有n个伐木的村庄,这些村庄都座…