【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp
题目描述
给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色。对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值。要求黑色的叶子节点数目不超过 $m$ ,求最大总贡献值。
$n\le 10$
输入
第一行两个数 n;m。接下来 2^(n-1) 行,每行n-1 个数,第 i 行表示编号为 2^(n-1)-1+ i 的平民对其n-1直系上司的作战贡献度,其中第一个数表示对第一级直系上司,即编号为 (2^(n-1)-1+ i)/2 的贵族的作战贡献度 wij,依次往上。接下来 2^(n-1)行,每行n-1个数,第i行表示编号为 2^(n-1)-1+ i的平民对其n-1个直系上司的后勤贡献度,其中第一个数表示对第一级直系上司,即编号为 (2^(n-1)-1+ i)/2 的贵族的后勤贡献度 fij ,依次往上。
输出
一行一个数表示满足条件的最大贡献值
样例输入
3 4
503 1082
1271 369
303 1135
749 1289
100 54
837 826
947 699
216 389
样例输出
6701
题解
暴力+树形背包dp
[NOI2006]网络收费 的套路。
提前计算叶子节点的总贡献,设 $f[i][j]$ 表示以 $i$ 为根的子树中,$j$ 个叶子节点的颜色为黑色( $j$ 个平民选择战争)的最大总贡献值。
那么这显然是一个树形背包问题,处理左右节点后背包合并即可。
但是由于叶子节点的贡献与其祖先节点的颜色选择有关,我们不能直接得到贡献。由于这是一棵完全二叉树,因此可以暴力枚举每个非叶子节点的颜色。
这样有递归式 $T(1)=O(\log k),T(k)=4T(\frac k2)+O(k^2)$ ,不考虑 $T(1)$ 时根据主定理解得 $T(k)=O(k^2\log k)$ ,考虑 $T(1)$ 时 $T(1)$ 被计算了 $k^2$ 次,贡献为 $O(k^2\log k)$ 。
因此总的时间复杂度是正确的,为 $O(2^{2n}·n)$ 。
- #include <cstdio>
- #include <algorithm>
- #define N 1030
- using namespace std;
- int n , w[N][12] , v[N][12] , f[N][N] , p[12];
- void dfs(int x , int d)
- {
- int i , j;
- for(i = 0 ; i <= 1 << d ; i ++ ) f[x][i] = 0;
- if(!d)
- {
- for(i = 1 ; i <= n ; i ++ )
- {
- if(p[i]) f[x][1] += w[x][i];
- else f[x][0] += v[x][i];
- }
- return;
- }
- p[d] = 0 , dfs(x << 1 , d - 1) , dfs(x << 1 | 1 , d - 1);
- for(i = 0 ; i <= 1 << (d - 1) ; i ++ )
- for(j = 0 ; j <= 1 << (d - 1) ; j ++ )
- f[x][i + j] = max(f[x][i + j] , f[x << 1][i] + f[x << 1 | 1][j]);
- p[d] = 1 , dfs(x << 1 , d - 1) , dfs(x << 1 | 1 , d - 1);
- for(i = 0 ; i <= 1 << (d - 1) ; i ++ )
- for(j = 0 ; j <= 1 << (d - 1) ; j ++ )
- f[x][i + j] = max(f[x][i + j] , f[x << 1][i] + f[x << 1 | 1][j]);
- }
- int main()
- {
- int m , i , j , ans = 0;
- scanf("%d%d" , &n , &m) , n -- ;
- for(i = 0 ; i < (1 << n) ; i ++ ) for(j = 1 ; j <= n ; j ++ ) scanf("%d" , &w[i + (1 << n)][j]);
- for(i = 0 ; i < (1 << n) ; i ++ ) for(j = 1 ; j <= n ; j ++ ) scanf("%d" , &v[i + (1 << n)][j]);
- dfs(1 , n);
- for(i = 0 ; i <= m ; i ++ ) ans = max(ans , f[1][i]);
- printf("%d\n" , ans);
- return 0;
- }
【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp的更多相关文章
- 【bzoj4007】[JLOI2015]战争调度 暴力+树形dp
Description 脸哥最近来到了一个神奇的王国,王国里的公民每个公民有两个下属或者没有下属,这种 关系刚好组成一个 n 层的完全二叉树.公民 i 的下属是 2 * i 和 2 * i +1.最下 ...
- 【bzoj1495】[NOI2006]网络收费 暴力+树形背包dp
题目描述 给出一个有 $2^n$ 个叶子节点的完全二叉树.每个叶子节点可以选择黑白两种颜色. 对于每个非叶子节点左子树中的叶子节点 $i$ 和右子树中的叶子节点 $j$ :如果 $i$ 和 $j$ 的 ...
- [BZOJ4007][JLOI2015]战争调度(DP+主定理)
第一眼DP,发现不可做,第二眼就只能$O(2^{1024})$暴搜了. 重新审视一下这个DP,f[x][i]表示在x的祖先已经全部染色之后,x的子树中共有i个参战平民的最大贡献. 设k为总结点数,对于 ...
- BZOJ4007 [JLOI2015]战争调度
根本想不出来... 原来还是暴力出奇迹啊QAQ 无限ymymym中 /************************************************************** Pr ...
- 【BZOJ4007】[JLOI2015]战争调度(动态规划)
[BZOJ4007][JLOI2015]战争调度(动态规划) 题面 BZOJ 洛谷 题解 神仙题,我是做不来. 一个想法是设\(f[i][j]\)表示当前考虑到\(i\)节点,其子树内有\(j\)个人 ...
- [JLOI2015]战争调度
[JLOI2015]战争调度 题目 解题报告 考试打了个枚举的暴力,骗了20= = $qsy$大佬的$DP$: 其实就是枚举= =,只不过枚举的比较强= = #include<iostream& ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- 【bzoj4987】Tree 树形背包dp
题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...
- 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...
随机推荐
- 20155325 信息安全技术 实验二 Windows口令破解
内容一览 实验结果 遇到的问题 思考题 详细步骤与解析(为了使存做笔记资料而做) 实验结果 字典破解 暴力破解 -不同密码强度的破解时间比较 用户名 密码 破解方式 破解时间 TEST (年月日) 字 ...
- [BZOJ1565][NOI2009]植物大战僵尸-[网络流-最小割+最大点权闭合子图+拓扑排序]
Description 传送门 Solution em本题知识点是用网络流求最大点权闭合子图. 闭合图定义:图中任何一个点u,若有边u->v,则v必定也在图中. 建图:运用最小割思想,将S向点权 ...
- c++静态变量
静态变量 一.静态变量 static关键字 static int i; 二.静态变量的运用 .计算函数被调用次数 .返回指针 第45课中有这么一段 int* square3(int *x) { int ...
- GDAL中通过GDALDriver类的Create函数实现图像的保存
GDAL中除了读取各种类型的图像外,也可以实现对各种图像的保存操作,具体实现测试代码如下: int test_gadl_GDALDataset_write() { const char* image_ ...
- 【BZOJ2004】[HNOI2010]Bus 公交线路
[BZOJ2004][HNOI2010]Bus 公交线路 题面 bzoj 洛谷 题解 $N$特别大$P,K$特别小,一看就是矩阵快速幂+状压 设$f[S]$表示公交车状态为$S$的方案数 这是什么意思 ...
- C#:在AnyCPU模式下使用CefSharp
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述如何在AnyCPU模式下使用CefSharp 因为在某些情况下,不得不用AnyCPU,但是CefS ...
- JS基础,课堂作业,计算器
网页内的简单计算器 <script> var a = parseInt(prompt("请输入第一个数字:")); var b = parseInt(prompt(&q ...
- Cannot get connection for URL jdbc:oracle:thin:调用中无效参数
这个报错明显是连接数据库的url没有写对,但是,我要说的是但是,同样的代码生产没有问题,而测试环境报错了.最终哥找到那个错误,jdbc连接数据库时,有ResultSet,PreparedStateme ...
- python3 - 元组、集合
元组(tuple) 有序集合,不可变 a(1,2,3) a[0]获取第一个值 集合(set)增删改 >>> b = set('abc') >>> bset(['a' ...
- LJ语录
"保持安静,不要打扰我睡觉." ( 半分钟后) "哎呦喂~可以睡觉喽~" "考场上遇到这种题目,你们应该高兴." "因为考场上那群 ...