【bzoj1495】[NOI2006]网络收费 暴力+树形背包dp
题目描述
给出一个有 $2^n$ 个叶子节点的完全二叉树。每个叶子节点可以选择黑白两种颜色。
对于每个非叶子节点左子树中的叶子节点 $i$ 和右子树中的叶子节点 $j$ :
如果 $i$ 和 $j$ 的颜色都为当前节点子树中颜色较多(相等视为白色)的那个,则不需要付出代价;
都为较小的那个则需要付 $2f[i][j]$ 的代价;
否则需要付 $f[i][j]$ 。
求最小代价。
输入
输出
你的程序只需要向输出文件输出一个整数,表示NS中学支付给网络公司的最小总费用。(单位:元)
样例输入
2
1 0 1 0
2 2 10 9
10 1 2
2 1
3
样例输出
8
题解
暴力+树形背包dp
先Orz一发CQzhangyu
首先观察付出代价的方式,可以改看作为:对于 $i$ ,选了颜色较少的那个则需要付出 $f[i][j]$ 的代价。这样我们就把两个点之间的代价转化为了单个点的代价。
然后由于这么多状态难以统计,因此需要提前计算代价。
设 $f[i][j]$ 表示点 $i$ 为根的子树内有 $j$ 个叶子节点选了黑色的最小总代价。那么这是一个树形背包问题,递归左右子树后跑背包合并即可。
然而这里有一个非常大的问题:代价的类型是与颜色较少还是较多有关的。
CQzhangyu给出的解法是:暴力枚举这两种情况,分别留下有用部分。由于是完全二叉树,因此有递归式:$T(1)=\log n,T(n)=4T(\frac n2)+O(n^2)$ ,不考虑 $T(1)$ 时根据主定理解得 $T(n)=O(n^2\log n)$ ,单独考虑 $T(1)$ ,1被考虑了 $n^2$ 次,因此也是 $O(n^2\log n)$ 。
因此直接暴力的复杂度是对的。
时间复杂度 $O(2^{2n}·n)$ 。
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #define N 1030
- #define ls x << 1
- #define rs x << 1 | 1
- using namespace std;
- typedef long long ll;
- int n , m , a[N] , t[N];
- ll c[N] , w[N][N] , v[N][N] , f[N << 1][N];
- void init(int x , int d)
- {
- if(!d) return;
- int i , j;
- init(ls , d - 1) , init(rs , d - 1);
- for(i = x << d ; i < ((x << 1) + 1) << (d - 1) ; i ++ )
- for(j = ((x << 1) + 1) << (d - 1) ; j < (x + 1) << d ; j ++ )
- v[i - m][x] += w[i - m][j - m] , v[j - m][x] += w[i - m][j - m];
- }
- void dfs(int x , int d)
- {
- int i , j;
- if(!d)
- {
- f[x][a[x - m]] = 0;
- f[x][a[x - m] ^ 1] = c[x - m];
- for(i = x >> 1 ; i ; i >>= 1) f[x][t[i]] += v[x - m][i];
- return;
- }
- memset(f[x] , 0x3f , sizeof(ll) * ((1 << d) + 1));
- t[x] = 1 , dfs(ls , d - 1) , dfs(rs , d - 1);
- for(i = 0 ; i <= 1 << (d - 1) ; i ++ )
- for(j = 0 ; j <= (1 << (d - 1)) - i ; j ++ )
- f[x][i + j] = min(f[x][i + j] , f[ls][i] + f[rs][j]);
- t[x] = 0 , dfs(ls , d - 1) , dfs(rs , d - 1);
- for(i = 1 ; i <= 1 << (d - 1) ; i ++ )
- for(j = (1 << (d - 1)) - i + 1 ; j <= 1 << (d - 1) ; j ++ )
- f[x][i + j] = min(f[x][i + j] , f[ls][i] + f[rs][j]);
- }
- int main()
- {
- int i , j;
- ll ans = 1ll << 62;
- scanf("%d" , &n) , m = 1 << n;
- for(i = 0 ; i < m ; i ++ ) scanf("%d" , &a[i]);
- for(i = 0 ; i < m ; i ++ ) scanf("%lld" , &c[i]);
- for(i = 0 ; i < m ; i ++ )
- for(j = i + 1 ; j < m ; j ++ )
- scanf("%lld" , &w[i][j]);
- init(1 , n);
- dfs(1 , n);
- for(i = 0 ; i <= m ; i ++ ) ans = min(ans , f[1][i]);
- printf("%lld\n" , ans);
- return 0;
- }
【bzoj1495】[NOI2006]网络收费 暴力+树形背包dp的更多相关文章
- BZOJ1495 [NOI2006]网络收费 【树形dp + 状压dp】
题目链接 BZOJ1495 题解 观察表格,实际上就是分\(A\)多和\(B\)两种情况,分别对应每个点选\(A\)权值或者\(B\)权值,所以成对的权值可以分到每个点上 所以每个非叶节点实际对应一个 ...
- BZOJ_1495_[NOI2006]网络收费_树形DP
BZOJ_1495_[NOI2006]网络收费_树形DP Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而, 不可忽视的一点就 ...
- 【bzoj4007】[JLOI2015]战争调度 暴力+树形背包dp
题目描述 给你一棵 $n$ 层的完全二叉树,每个节点可以染黑白两种颜色.对于每个叶子节点及其某个祖先节点,如果它们均为黑色则有一个贡献值,如果均为白色则有另一个贡献值.要求黑色的叶子节点数目不超过 $ ...
- 【BZOJ1495】[NOI2006]网络收费 暴力+DP
[BZOJ1495][NOI2006]网络收费 Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而,不可忽视的一点就是网络本身有 ...
- bzoj1495 [NOI2006]网络收费 复杂度分析+树上背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1495 题解 通过观察可以发现,对于一个 \(lca\),如果 \(nA \leq nB\),那 ...
- BZOJ1495 [NOI2006]网络收费
题意 传送门 MY市NS中学,大概是绵阳市南山中学. 分析 参照Maxwei_wzj的题解. 因为成对的贡献比较难做,我们尝试把贡献算到每一个叶子节点上.我们发现按照题目中的收费方式,它等价于对于每棵 ...
- 洛谷 P4297 [NOI2006]网络收费
P4297 [NOI2006]网络收费 题目背景 noi2006 day1t1 题目描述 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而,不可忽视的 ...
- 【简】题解 P4297 [NOI2006]网络收费
传送门:P4297 [NOI2006]网络收费 题目大意: 给定一棵满二叉树,每个叶节点有一个状态(0,1),任选两个叶节点,如果这两个叶节点状态相同但他们的LCA所管辖的子树中的与他们状态相同的叶节 ...
- 并不对劲的[noi2006]网络收费
题目略长,就从大视野上复制了. 听上去好像费用流,然而…… ***************************表示略长的题目的分界线************************ 1495: [ ...
随机推荐
- #20155331 2016-2017-2 《Java程序设计》第3周学习总结
20155331 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 程序中的类由两个部分组成:属性和方法.属性对应的是对象的特征:方法对应的是对象的行为 ...
- Zabbix学习之路(六)TCP状态监控
TCP状态监控 Tcp的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB:或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了***,或是是time_wait值比 ...
- cogs1533 [HNOI2002]营业额统计
cogs1533 [HNOI2002]营业额统计 啦啦啦啦 不维护区间的平衡树题都是树状数组+二分练手题! 不会的参考我的普通平衡树的多种神奇解法之BIT+二分答案 和上一篇博文完全一样2333 另外 ...
- unittest,requests——接口测试脚本及报告
用unittest管理两个利用requests模块,做百度搜索的简单接口测试用例,之后自动输出报告 # encoding=utf-8import requests,unittest,HTMLTestR ...
- qt linux系统下出现Qt5: Unknown module(s) in QT: serialport问题解决
需要单独安装这个模块, manjaro linux打开包管理器,搜索安装,就好了
- HttpServletResponse 之 sendError( )
直接返回http 401状态,提示重新登录 response.sendError(401, "当前账户未登录或会话失效,请重新登录!) HTTP状态码列表: 100Continue继续.客户 ...
- python-生成器、迭代器、装饰器
目录 动态语言和静态语言 __slots__ 生成器 迭代器 闭包 装饰器 动态语言和静态语言 动态语言可以在运行的过程中修改代码,例如python在运行的过程中给已创建好的类添加属性和方法. 静态语 ...
- v-for 指令
JS部分: var app = new Vue({ el: "#app", data() { return { list: [1, 2, 3, 4], objList: [ { i ...
- Tensorflow、Pytorch、Keras的多GPU使用
Tensorflow.Pytorch.Keras的多GPU的并行操作 方法一 :使用深度学习工具提供的 API指定 1.1 Tesorflow tensroflow指定GPU的多卡并行的时候,也是可以 ...
- WCF传送大数据时的错误“ 超出最大字符串内容长度配额”
格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: GetLzdtArticleResult.InnerException 消息是“反序 ...