HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)

Description

给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。

Input

输入文件共2行。

第一行包括一个整数n。

第二行包括n个整数,第i个整数表示ai。

Output

输出文件共一行。

包括一个整数,表示子序列bi的最长长度。

Sample Input

3

1 2 3

Sample Output

2

Http

HYSBZ:http://www.lydsy.com/JudgeOnline/problem.php?id=4300

Source

递推,位运算

解决思路

初看这道题目,觉得有点像最长不下降子序列,但是又有些不同。

在这里我们要巧妙地运用题目中给出的位运算的条件。

首先我们看题目中对b序列的x要求:

\[b_i\&b_{i-1}!=0
\]

这也就是说,如果我们把每一个数都转成2进制,那么要求两个数至少有相同的一位都是1。

什么意思,还是画图来分析:



现在我们有这两个数都转成二进制存在上面,如果他们有相同的一位都是1,即可以连接(如下图)



这样的两个数就可以连接。

而若是像下图这样,就不可以连接:



跟据上面我们的分析,我们设一个数组Solve,Solve第i位表示如果接在二进制的第i位上现在能接的最长长度。

那么如何计算Solve呢?

对于每一个数(假设是x),我们从低位到高位依次扫描x中是1的位置,取出对应的Solve数组中的最大值,然后把Solve中的这些值全部更新为这个最大值+1。

直接这么说可能会有些头大,我们还是借助图来说明一下。

假设我们现在有这样一个例子,左边是Solve数组,右边是x转成二进制后的样子



现在我们框出对应X的位上为1的Solve数组的数,并选出最大值(红框框起来的就是选出的数,黄框是最大值):



将所有框中(zhong4声)的Solve的值都更新为最大值+1



这样处理每一个数,最后Solve数组中最大的就是结果了。

为什么这样是对的呢?

参考一下我们最长不下降子序列的做法,我们是设F[i]表示以i结尾的最长不下降子序列的长度,那么在这里,Solve[i]表示的是二进制以第i位为真结尾的最长满足题意的子序列。所以,我们这样做是对的。

另外可能产生疑问的一个地方就是我们为什么更新答案的时候是所有是1的那一位的答案都要更新成最大值+1呢?

因为根据我们对Solve的定义,既然这一位是1并且通过另外的方式连过来的长度更长,尽管并不是从这一位连过去的,但从定义出发,这里也是可以的。

这个地方不是很好理解,如果还有疑问,可以在留言区留言,博主会尽量回复。

PS:话说这真是一道绝世好题

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; const int maxN=100001;
const int inf=2147483647; int n;
int A[maxN];
int Solve[40]={0}; int main()
{
cin>>n;
for (int i=1;i<=n;i++)
cin>>A[i];
int Ans=0;
for (int i=1;i<=n;i++)
{
int now_ans=1;
for (int j=0,sum=1;j<=40;j++,sum=sum<<1)//取出最大值
if (sum&A[i])
now_ans=max(now_ans,Solve[j]+1);
for (int j=0,sum=1;j<=40;j++,sum=sum<<1)//把所有在x上这一位是1的都更新成当前最大值+1
if (sum&A[i])
Solve[j]=max(Solve[j],now_ans);
Ans=max(now_ans,Ans);//更新最后要输出的最大值
}
cout<<Ans<<endl;
return 0;
}

HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)的更多相关文章

  1. BZOJ 4300: 绝世好题 动态规划

    4300: 绝世好题 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的 ...

  2. 【递推】BZOJ 4300:绝世好题

    4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 564  Solved: 289[Submit][Status][Discuss] ...

  3. bzoj 4300: 绝世好题 dp

    4300: 绝世好题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...

  4. bzoj 4300: 绝世好题

    4300: 绝世好题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi& ...

  5. BZOJ 4300 绝世好题(位运算)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4300 [题目大意] 给出一个序列a,求一个子序列b,使得&和不为0 [题解] ...

  6. bzoj 4300 绝世好题——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 考虑 dp[ i ] 能从哪些 j 转移过来,就是那些 a[ j ] & a[ ...

  7. bzoj 4300 绝世好题 —— 思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 记录一下 mx[j] 表示以第 j 位上是1的元素结尾的子序列长度最大值,转移即可. ...

  8. bzoj 4300: 绝世好题【dp】

    设f[i][j]表示数列到i为止最后一项第j位为1的最大子序列长度,每次从i-1中1<<j&a[i]!=0的位+1转移来 然后i维是不需要的,答案直接在dp过程中去max即可 #i ...

  9. BZOJ 4300: 绝世好题 二进制

    对于每一个数字拆位,然后维护一个大小为 30 左右的桶即可. code: #include <bits/stdc++.h> #define N 100006 #define setIO(s ...

随机推荐

  1. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法

      #1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...

  2. Acer 4750G安装OS X 10.9 DP4(简版)

    一.下载os x 10.9懒人版:http://bbs.pcbeta.com/viewthread-1384504-1-1.html 二.用系统自带的磁盘分区工具划分一个5G左右的临时安装盘(新建分区 ...

  3. [译文]c#扩展方法(Extension Method In C#)

    原文链接: https://www.codeproject.com/Tips/709310/Extension-Method-In-Csharp 介绍 扩展方法是C# 3.0引入的新特性.扩展方法使你 ...

  4. Python之并发编程-IO模型

    目录 一.IO模型介绍二.阻塞IO(blocking IO)三.非阻塞IO(non-blocking IO)四.多路复用IO(IO multiplexing)五.异步IO(Asynchronous I ...

  5. Vue 事件处理

    原生的js事件处理 原生的js事件处理,可以分为:直接内联执行代码,或者绑定事件函数. 在内联的事件处理函数内部或者事件绑定的方法内部的作用域中的this都是指向当前的dom对象.如何在vue绑定的元 ...

  6. "prefs:root" or "App-Prefs:root"

    iOS 苹果审核也是看心情的吗?已经上线几个版本了,新版本提交审核居然被查出来了! Guideline 2.5.1 - Performance - Software Requirements Your ...

  7. json转对象

    1,引入依赖 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib& ...

  8. Scrum Meeting 10.31

    成员 今日任务 明日任务 今日工作时长 徐越 整理开发文档,学习ip相关知识,学习servlet相关知识 代码迁移,学习数据库相关知识 5h 赵庶宏 学习学长的servlet代码 进行数据库的连接 4 ...

  9. 信息安全系统设计基础_exp1

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础 班级:1353 姓名:吴子怡.郑伟 学号:20135313.20135322 指导教师: 娄嘉鹏 实验 ...

  10. 2017-2018-1 Java演绎法 第九、十周 作业

    团队成员 [20162315 马军] [20162316 刘诚昊] [20162317 袁逸灏(组长)] [20162319 莫礼钟] [20162320 刘先润] [20162330 刘伟康] 项目 ...