Link:

P2396 传送门

Solution:

一眼能看出$O(n*2^n)$的状压$dp$

但此题是个卡常题,$n=23/24$的时候就别想过了

这题算是提供了一种对状压$dp$的优化思路吧

原来我们要用$n$的时间来查找当前有哪些位为1,然后从这些位来转移

但实际上可以通过树状数组中$lowbit$函数的方式用$popcount(i)$的复杂度来得到所有的1

此时总的复杂度降到了$O(\sum_{i=1}^{2^n-1} popcount(i))$,实际上就是$O(n*2^{n-1})$

虽然只减少了1倍的时间,但开个$O2$还是勉强能卡过去

Tip:使用这种优化时只能从$dp[i\^(1<<j)]$向$dp[i]$转移,而不能从$dp[i]$向$dp[i|(1<<j)]$转移了

Code:

#include <bits/stdc++.h>

using namespace std;
const int MAXN=<<,MOD=1e9+;
int n,dat[MAXN],dp[MAXN],m,m1,m2,lst,t; void inc(int &a,int b){a=(a+b>=MOD)?(a+b-MOD):a+b;}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d",&dat[<<i]);
scanf("%d",&m);
if(m>=) scanf("%d",&m1);
if(m>=) scanf("%d",&m2); dp[]=;int MAX=(<<n)-;
for(int i=;i<=MAX;i++)
{
lst=i&(-i);
dat[i]=dat[i^lst]+dat[lst];
if(dat[i]==m1||dat[i]==m2) continue; for(t=i;t;t^=lst,lst=t&(-t))
inc(dp[i],dp[i^lst]);
}
printf("%d",dp[MAX]);
return ;
}

[P2396] yyy loves Maths VII的更多相关文章

  1. 洛谷P2396 yyy loves Maths VII

    P2396 yyy loves Maths VII 题目背景 yyy对某些数字有着情有独钟的喜爱,他叫他们为幸运数字;然而他作死太多,所以把自己讨厌的数字成为"厄运数字" 题目描述 ...

  2. 洛谷P2396 yyy loves Maths VII【状压dp】

    题目:https://www.luogu.org/problemnew/show/P2396 题意:有n个数,每次选择一个表示走$a[i]$步,每个数只能选一次. 最多有两个厄运数字,如果走到了厄运数 ...

  3. [CF327E]Axis Walking([洛谷P2396]yyy loves Maths VII)

    题目大意:给一个长度为$n(1\leqslant n\leqslant24)$的序列$S$和$k(0\leqslant k\leqslant2)$个数. 求有多少种$S$的排列方式使得其任何一个前缀和 ...

  4. [洛谷P2396]yyy loves Maths VII $\&$ [CF327E]Axis Walking

    这道题是一个状压动归题.子集生成,每一位表示是否选择了第$i$个数. 转移:$f[S] = \sum f[S-\{x\}]$且$x\in S$,当该子集所有元素的和为$b_1$或$b_2$时不转移. ...

  5. yyy loves Maths VII(状压DP)

    题目背景 yyy对某些数字有着情有独钟的喜爱,他叫他们为幸运数字;然而他作死太多,所以把自己讨厌的数字成为"厄运数字" 题目描述 一群同学在和yyy玩一个游戏 每次,他们会给yyy ...

  6. 洛谷P2397 yyy loves Maths VI (mode)

    P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...

  7. P2393 yyy loves Maths II

    P2393 yyy loves Maths IIlong double比如保留5位小数*1000000都变成整数最后再/1000000避免精度误差scanf("%Lf",& ...

  8. bzoj2456 / P2397 yyy loves Maths VI (mode)

    P2397 yyy loves Maths VI (mode) 神奇的摩尔投票法(大雾) 保证众数个数大于一半. 两两相消,剩下的那个必定是众数. 我们只要开2个变量,一个存个数,一个存值即可. (l ...

  9. 洛谷——P2393 yyy loves Maths II

    P2393 yyy loves Maths II 题目背景 上次蒟蒻redbag可把yyy气坏了,yyy说他只是小学生,蒟蒻redbag这次不坑他了. 题目描述 redbag给了yyy很多个数,要yy ...

随机推荐

  1. hadoop基础----hadoop实战(九)-----hadoop管理工具---CDH的错误排查(持续更新)

    在CDH安装完成后或者CDH使用过程中经常会有错误或者警报,需要我们去解决,积累如下: 解决红色警报 时钟偏差 这是因为我们的NTP服务不起作用导致的,几台机子之间有几秒钟的时间偏差. 这种情况下一是 ...

  2. css的padding,border,margin的意思

    下面的内边距(padding).边框(border) .外边距(margin)的意思是我自己的理解. 代码如下: <!DOCTYPE html> <html lang="e ...

  3. 通过js修改微信内置浏览器title

    document.setTitle = function(t) { document.title = t; var i = document.createElement('iframe'); i.sr ...

  4. linux下解压,压缩命令大全---方便新手查看

    本文最后讲述如何在打包时排除某些文件 .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) --- ...

  5. React 使用 fetch 请求天气

    中国天气网(http://www.weather.com.cn)提供了查询天气的 API,通过传入城市 id, 可以获得当前城市的天气信息,API 相关信息如下: 规格  描述 主机地址 http:/ ...

  6. Extjs3.4 合并单元格

    Ext3.4合并单元格   表格上添加grid-row-span样式

  7. 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)

    补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...

  8. Linux下查看使用的是哪种shell的方法汇总【转】

    转自:http://www.jb51.net/LINUXjishu/247797.html 查看当前发行版可以使用的shell 复制代码 代码如下: [root@localhost ~]$ cat / ...

  9. myeclipse打断点进入后无法查看变量的值的解决方法

    myeclipse打断点进入后无法查看变量的值,打开mycelipse菜单选项:“Window” - “Preferences” - “Java” - “Editor” - “Hovers" ...

  10. OC学习篇之---代理模式

    何实现代理模式的. 这里举一个简单的例子: 小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play 这里代理对象就是:护士类.保姆类,小孩类是被代理对象. 看一下代码: 首先看一下小孩类: ...