博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1406:与查询
阅读量:6708 次
发布时间:2019-06-25

本文共 1167 字,大约阅读时间需要 3 分钟。

51nod 1406:与查询

题目链接:

题目大意:给出$n$个数,问这$n$个数与$x$做位与($\&$)后值为$x$的有多少个.

DP

显然暴力是不行的.

由题目可得,若$a \& x=x$,则$x$的二进制表示中为$1$的位,$a$也必为$1$.

故若$x$和$y$仅有一位不同,且$x\&y=x$,则 与$x$做位与后值为$x$的数中 必包含 与$y$做位与后值为$y$的数.

我们将一个数$x$分成两部分:$x_{+i}$和$x_{-i}$,分别表示$x$二进制表示的前$i$位和后$20-i$位(如$1023_{+10}=1111111111$,$1023_{-10}=0000000000$).

定义状态 $dp[i][j]$为这$n$个数中,所有$a_{+i} \& j_{+i}=j_{+i}$且$a_{-i}=j_{-i}$的个数.

则初始状态$dp[0][j]$即为$n$个数中,值为$j$的数的个数.

不难得出状态转移方程:

  • 当$j$的第$i$(记第一位为$1$)位为$0$时,当前位可为$0$或$1$,故$dp[i][j]+=dp[i-1][j]+dp[i-1][j|(1<<(i-1))]$.
  • 当$j$的第$i$位为$1$时,当前位只能为$1$,故$dp[i][j]+=dp[i-1][j]$.

需要注意的是输入输出的量很大,需要使用输入输出挂.

代码如下:

1 #include 
2 using namespace std; 3 int n,t,dp[21][1<<20]; 4 int in(){ 5 int res=0,flag=0,ch; 6 if((ch=getchar())=='-')flag=1; 7 else if('0'<=ch&&ch<='9')res=ch-'0'; 8 while('0'<=(ch=getchar())&&ch<='9')res=res*10+ch-'0'; 9 return flag?-res:res;10 }11 void out(int x){12 if(x>9)out(x/10);13 putchar('0'+x%10);14 }15 int main(void){16 n=in();17 for(int i=0;i

上述算法在空间复杂度上可以进行优化:

1 for(int i=0;i<20;++i)2     for(int j=0;j<(1<<20);++j)3         if((j&(1<
<

 

转载于:https://www.cnblogs.com/barrier/p/6664229.html

你可能感兴趣的文章
什么是DSCP,如何使用DSCP标记搭配ROS策略
查看>>
JPQL设置自增长、只读、文本类型等的注解
查看>>
【.net 深呼吸】自定义应用程序配置节
查看>>
【POI】对于POI无法处理超大xls等文件,官方解决方法【已解决】【多线程提升速率待定】...
查看>>
<html>
查看>>
SQL 查询逻辑处理顺序
查看>>
Android实训案例(七)——四大组件之中的一个Service初步了解,实现通话录音功能,抽调接口...
查看>>
Springmvc 中org.springframework.http.converter.json.MappingJackson2HttpMessageConverter依赖jackson包...
查看>>
[转载]从业务运维转到产品经理,我摸爬滚打的产品之路
查看>>
JDK工具jstatd用法详解(转)
查看>>
剑指offer47 不用加减乘除做加法
查看>>
为什么WEB-INF外的jsp无法根据cookie享受国际化
查看>>
Hbase 技术细节笔记(上)
查看>>
Java线程池详解
查看>>
深度学习入门篇--手把手教你用 TensorFlow 训练模型
查看>>
mybatis报错 Specified class is an interface
查看>>
不等双十一,ChemDraw降价活动已经打开!
查看>>
kubernetes入门(03)kubernetes的基本概念
查看>>
next.js 简单使用
查看>>
https和server-status配置案例
查看>>