又是一道思路清新的小清晰。

观察题目,如果我们确定了平民或者贵族的任意一方,我们便可以贪心的求出另一方,至此20分;我们发现层数十分小,那么我们就也是状压层数,用lca转移,线性dp,至此50分(好像数据很水这么打能A);至今我们没有用到他是一棵完全二叉树,那么我们发现如果进行树dp,也就是说从子节点转移到父节点,f[i][j],以i为根的子树里的平民有j个参战贡献最大值,我们需要确定平民的请况而且有不能状压,但是结合我们上次得出的结论,我们发现如果我们dp状态的意义为,在确定由此节点到root的所有节点的状态时,以i为根的子树里的平民有j个参战贡献最大值,我们就可以不用知道平民的情况了,就是f[i][j][k],那么我们就可以合并上去了,然而我们发现这样不仅TLE而且MLE,但是如果我们k那一维通过枚举而实现呢,我们就可以即时转移而去掉最后一维,而且丢掉许多无效状态,然而我们发现k他从最底层到最高层呈现指数递减,我们可以兴奋一下然后认真考虑时间复杂度了:对于每一个出口也就是叶子节点我们最多出去2^10次并且每次算贡献O(10),于是O(10*2^20),然后每次合并——在根处2^9*2^9*1,往下走一层需要合并的点数乘2^2,合并大小除2,于是总的为层数乘点数平方即O(10*2^20)。于是总时间复杂度O(10*2^20)。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ls (pos<<1)
#define rs ((pos<<1)|1)
using std::max;
const int N=(<<)+;
int f[N][N],tw[N][],tg[N][],w[N][N],g[N][N];
int n,m,len,bin[];
void read_pre(){
scanf("%d%d",&n,&m),len=<<(n-);
for(int i=;i<=len;++i)
for(int j=;j<n;++j)
scanf("%d",&tw[i][j]);
for(int i=;i<=len;++i)
for(int j=;j<n;++j)
scanf("%d",&tg[i][j]);
for(int i=;i<=len;++i)
for(int j=;j<len;++j)
for(int k=;k<n;++k)
(j&(<<(k-)))?w[i+len-][j]+=tw[i][k]:g[i+len-][j]+=tg[i][k];
bin[n-]=;
for(int i=n-;i>;--i)bin[i]=bin[i+]<<;
}
void dfs(int pos,int deep,int state){
if(deep==n){
f[pos][]=g[pos][state],f[pos][]=w[pos][state];
return;
}
memset(f[pos],,sizeof(f[pos]));
dfs(ls,deep+,state|bin[deep]),
dfs(rs,deep+,state|bin[deep]);
for(int i=;i<=bin[deep];++i)
for(int j=;j<=bin[deep];++j)
f[pos][i+j]=max(f[pos][i+j],f[ls][i]+f[rs][j]);
dfs(ls,deep+,state),
dfs(rs,deep+,state);
for(int i=;i<=bin[deep];++i)
for(int j=;j<=bin[deep];++j)
f[pos][i+j]=max(f[pos][i+j],f[ls][i]+f[rs][j]);
}
void work_print(){
dfs(,,);int ans=;
for(int i=;i<=m;++i)
ans=max(ans,f[][i]);
printf("%d",ans);
}
int main(){
read_pre();
work_print();
return ;
}

【BZOJ 4007】[JLOI2015]战争调度 DP+搜索+状压的更多相关文章

  1. BZOJ 1076: [SCOI2008]奖励关 [DP 期望 状压]

    传送门 题意:$n$种宝物,出现$k$次每次一种,每种宝物有价值和吃掉它之前必须要吃掉的宝物的集合,求采取最优策略的期望最大价值 1<=k<=100,1<=n<=15,分值为[ ...

  2. [BZOJ4007][JLOI2015]战争调度(DP+主定理)

    第一眼DP,发现不可做,第二眼就只能$O(2^{1024})$暴搜了. 重新审视一下这个DP,f[x][i]表示在x的祖先已经全部染色之后,x的子树中共有i个参战平民的最大贡献. 设k为总结点数,对于 ...

  3. 【BZOJ4007】[JLOI2015]战争调度(动态规划)

    [BZOJ4007][JLOI2015]战争调度(动态规划) 题面 BZOJ 洛谷 题解 神仙题,我是做不来. 一个想法是设\(f[i][j]\)表示当前考虑到\(i\)节点,其子树内有\(j\)个人 ...

  4. [JLOI2015]战争调度

    [JLOI2015]战争调度 题目 解题报告 考试打了个枚举的暴力,骗了20= = $qsy$大佬的$DP$: 其实就是枚举= =,只不过枚举的比较强= = #include<iostream& ...

  5. 【题解】JLOI2015战争调度

    搜索+状压+DP. 注意到一个性质:考虑一棵以x为根的子树,在x到原树的根的路径上的点如果都已经确定了方案,那么x的左右儿子的决策就彼此独立,互不影响了.所以我们考虑状压一条路径上每一层节点的状态,求 ...

  6. Codeforces Gym 191033 E. Explosion Exploit (记忆化搜索+状压)

    E. Explosion Exploit time limit per test 2.0 s memory limit per test 256 MB input standard input out ...

  7. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  8. dp乱写1:状态压缩dp(状压dp)炮兵阵地

    https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...

  9. poj2411 Mondriaan's Dream (轮廓线dp、状压dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17203   Accepted: 991 ...

随机推荐

  1. php-5.6.26源代码 - hash存储结构 - 初始化

    初始化 有指定析构函数,在销毁hash的时候会调用,如:“类似extension=test.so扩展”也是存放在HashTable中的,“类似extension=test.so扩展”的module_s ...

  2. Laravel 5.5搭建(lunix-ubuntu)

    基本配置 PHP >= 7.0.0 PHP OpenSSL 扩展 PHP PDO 扩展 PHP Tokenizer 扩展 PHP XML 扩展 1:nginx sudo apt-get upda ...

  3. 51定时器控制4各led,使用回调函数机制

    程序转载自51hei,经过自己的实际验证,多了一种编程的思路技能,回调函数的基本思想也是基于事件机制的,哪个事件来了, 就执行哪个事件. 程序中,最多四个子定时器,说明51的处理速度是不够的,在中断中 ...

  4. CSS3新特性回顾

    CSS3 介绍 开始实例 新特征简介 强大的CSS选择器 抛弃图片的视觉效果 盒模型变化(多列布局和弹性盒模型) 阴影效果 Web字体和web Font 图标 CSS33过渡与动画交互效果 媒体查询 ...

  5. 笔记-flask-原理及请求处理流程

    笔记-flask-原理及请求处理流程 1.      服务器声明及运行 最基本的flask项目代码如下 from flask import Flask app = Flask(__name__) @a ...

  6. PHP.38-TP框架商城应用实例-后台14-商品管理-商品扩展分类的删除、修改

    商品分类删除 1.删除商品时,根据商品id删除扩展分类表数据 商品扩展分类修改 1.在控制器GoodsController.class.php/edit()中根据商品id取出对应的所有扩展分类 2.在 ...

  7. python基础集结号

    Python 号称是最接近人工智能的语言,因为它的动态便捷性和灵活的三方扩展,成就了它在人工智能领域的丰碑 走进Python,靠近人工智能 一.编程语言Python的基础 之 "浅入浅出&q ...

  8. [Windows]_[C/C++]_[如何调试子进程]

    场景 1.VC++ 的程序A在启动程序C时, 如果需要调试程序C的话一般有两种, 一种是通过菜单 调试->附加到进程的方式来调试程序, 缺点就是这个进程必须先启动, 但是一启动的话有可能就执行了 ...

  9. P1509 找啊找啊找GF

    P1509 找啊找啊找GF 题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七 ...

  10. Cyclone IV器件的逻辑单元和逻辑阵列快

    1. 逻辑单元 (LE) 在 Cyclone IV 器件结构中是最小的逻辑单位.LE 紧密且有效的提供了高级功能的逻辑使用.每个 LE 有以下特性:一个四口输入的查找表 (LUT),以实现四种变量的任 ...