【BZOJ 3090】 树形DP
3090: Coci2009 [podjela]
Description
有 N 个农民, 他们住在 N 个不同的村子里. 这 N 个村子形成一棵树.
每个农民初始时获得 X 的钱.
每一次操作, 一个农民可以从它自己的钱中, 取出任意数量的钱, 交给某个相邻村子的农民.对于每个农民给定一个值 v_i, 求
(1) 最少需要多少次操作, 使得每个农民最终拿到的钱 >= 给定的值.Input
第1行: 一个整数 N (1 <= N <= 2000)
第2行: 一个整数 X (0 <= X <= 10000)
第3行: N 个整数, 表示 v_i. 保证所有 v_i 的和 <= N * X
第4..N+2行: 每行两个 1..N 的数, 表示树上的一条边. 边是双向的.Output
第1行: 一个整数, 最少需要的操作次数
Sample Input
6
15
10 20 18 16 6 16
1 4
4 5
4 6
6 2
5 3Sample Output
5HINT
Source
【分析】
之前做过很多次这种移来移去的题目了。
如果有环的,我就做过BZOJ 1045 一道数学题。
如果没环,目标值的和等于初始值的和,那么挺唯一的,直接for就好了。
这题就是目标值的和小于等于初始值的和的,考虑DP。
一开始的想法当然是f[x][y]表示x这个子树,然后y这个点的值,然后什么最小代价。
但是爆空间超时啊,不如把f中的y和答案换一下位置,因为显然操作次数少于子树大小,
f[x][y]表示x这棵子树在操作y次之后满足目标值,最少要x从父亲那里拿多少东西(若f的值小于0则表示不仅不用从父亲那里拿东西,还可以给-f[x][y]的东西给父亲)
然后DP。
这种要满足每个子树的题我真的是不太擅长,于是我最好的解决方案就是滚动一下了。
还有要注意的是x<=n,y<=x,所以看似三重循环,实际是n^2的,这个是之前做树形依赖的题知道的,因为可以看成只会在LCA的时候for到那两个东西。
大神的方法跟我的差不多然后讲的比我清楚:http://blog.csdn.net/visit_world/article/details/54297322
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 2010
#define INF 0xfffffff int mymin(int x,int y) {return x<y?x:y;}
int mymax(int x,int y) {return x>y?x:y;} int w[Maxn],ww; struct node
{
int x,y,next;
}t[Maxn*];
int first[Maxn],len; void ins(int x,int y)
{
t[++len].x=x;t[len].y=y;
t[len].next=first[x];first[x]=len;
} int f[Maxn][Maxn],g[][Maxn],sm[Maxn]; void dfs(int x,int ff)
{
sm[x]=;
for(int i=first[x];i;i=t[i].next) if(t[i].y!=ff)
{
int y=t[i].y;
dfs(y,x);
sm[x]+=sm[y];
}
if(sm[x]!=)
{
int p=;
for(int j=;j<=sm[x];j++) g[][j]=;
for(int i=first[x];i;i=t[i].next) if(t[i].y!=ff)
{
int y=t[i].y;
for(int j=;j<=sm[x];j++) g[-p][j]=INF;
//j-k<=sm[x]-1-sm[y]
//k>=j-sm[x]+sm[y]+1
for(int j=;j<=sm[x];j++)
{
int st=mymax(j-sm[x]+sm[y]+,);
for(int k=st;k<=sm[y];k++)
{
if(k>j) break;//j-k>=0
if(f[y][k]>)
{
if(k>=) g[-p][j]=mymin(g[-p][j],g[p][j-k]+f[y][k-]);
}
else
{
if(k>=) g[-p][j]=mymin(g[-p][j],g[p][j-k]+f[y][k-]);//give father
if(k!=sm[y]) g[-p][j]=mymin(g[-p][j],g[p][j-k]);
}
}
}
p=-p;
}
for(int j=;j<sm[x];j++) f[x][j]=g[p][j];
}
for(int j=;j<sm[x];j++)
{
f[x][j]=f[x][j]+w[x]-ww;
// printf("f[%d][%d]=%d\n",x,j,f[x][j]);
}
} int main()
{
int n;
scanf("%d%d",&n,&ww);
len=;
memset(first,,sizeof(first));
for(int i=;i<=n;i++) scanf("%d",&w[i]);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
}
memset(f,,sizeof(f));
dfs(,);
for(int i=;i<sm[];i++) if(f[][i]<=) {printf("%d\n",i);break;}
return ;
}
2017-03-22 10:26:09
【BZOJ 3090】 树形DP的更多相关文章
- BZOJ 1040 树形DP+环套树
就是有n个点n条边,那么有且只有一个环那么用Dfs把在环上的两个点找到.然后拆开,从这条个点分别作树形Dp即可. #include <cstdio> #include <cstrin ...
- BZOJ - 2500 树形DP乱搞
题意:给出一棵树,两个给给的人在第\(i\)天会从节点\(i\)沿着最长路径走,求最长的连续天数\([L,R]\)使得\([L,R]\)为起点的最长路径极差不超过m 求\(1\)到\(n\)的最长路经 ...
- BZOJ 4033 树形DP
http://blog.csdn.net/mirrorgray/article/details/51123741 安利队长blog- 树形dp吧,状态挺显然的,dp[x][j]表示以x为根的子树中,选 ...
- BZOJ 4987 (树形DP)
###题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4987 ###分析 先考虑贪心,显然k个节点形成一棵树 求出树的直径,显然直径应该只被经 ...
- [USACO10MAR]伟大的奶牛聚集 BZOJ 1827 树形dp+dfs
题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...
- bzoj 4007 树形dp
题目大意 脸哥最近来到了一个神奇的王国,王国里的公民每个公民有两个下属或者没有下属,这种关系刚好组成一个 n 层的完全二叉树.公民 i 的下属是 2 * i 和 2 * i +1.最下层的公民即叶子节 ...
- BZOJ 1369 树形DP
思路: f[i][j] 表示节点i 染成j时 子树的最小权值 (我会猜这个j很小 你打我吖~) 随便DP一发就好了 (证明我也不会) //By SiriusRen #include <cstdi ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- [BZOJ 1907] 树的路径覆盖 【树形DP】
题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子 ...
- bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]
4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...
随机推荐
- [linx] ubuntu网络重启命令
/etc/init.d/networking restart #这种方式必须有/etc/network/interface文件 ifconfig eth0 down #直接重启网卡 ifconfig ...
- 【BZOJ】4316: 小C的独立集 静态仙人掌
[题意]给定仙人掌图,求最大独立集(选择最大的点集使得点间无连边).n<=50000,m<=60000. [算法]DFS处理仙人掌图 [题解]参考:[BZOJ]1023: [SHOI200 ...
- yii2-widget-fileinput英文文档翻译
源地址:http://plugins.krajee.com/file-input 该插件是为bootstrap开发的增强版h5文件上传插件,具有多文件预览,多文件选择等功能.该插件提供了基于boots ...
- 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage
2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest, qualification stage A. Union of Doubly Link ...
- HDU 6195 2017沈阳网络赛 公式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6195 题意:有M个格子,有K个物品.我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个 ...
- Zabbix3.0 API调用
Zabbix API 是什么? API简单来说是服务对外开放的一个接口,用户通过该接口传递请求,完成操作.API的背后是一组方法的集合,这些方法实现了服务对应的不同功能,调用API实际上就是换了一种方 ...
- freemarker模板引擎的使用
freemarker是一套前端模板引擎,在使用时,要先在web项目中添加freemarker.jar的依赖. 我在这里主要演示spring-mvc整合freemarker模板引擎.项目案例的文件包结构 ...
- web项目更改文件后缀,隐藏编程语言
从Java EE5.0开始,<servlet-mapping>标签就可以配置多个<url-pattern>.例如可以同时将urlServlet配置一下多个映射方式: <s ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- SGU 206. Roads
206. Roads time limit per test: 0.5 sec. memory limit per test: 65536 KB input: standard output: sta ...