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. 关于Maven的一点理解

    maven是一个项目管理工具,主要作用是: 1.依赖管理(jar包,工程之间); 2.统一开发规范和工具.完成项目的一步构建 3.工程聚合.继承.依赖 其核心配置文件就是pom.xml:pom即Pro ...

  2. Vue+webpack报错: listen EADDRINUSE: address already in use :::8080

    如果本地运行多个vue+webpack项目会报错:listen EADDRINUSE: address already in use :::8080: 提示含义:地址端口已经被占用 注:8080指的是 ...

  3. podSpec文件相关知识整理

    上一篇文章整理了我用SVN创建私有库的过程,本文将整理一下有关podSpec文件的相关知识. podSpec中spec的全称是“Specification”,说明书的意思.顾名思义,这是用来描述你这个 ...

  4. Flexbox + js实现滑动拼图游戏

    滑动拼图就是把一张图片分成几等份,打乱顺序(下图),然后通过滑动拼凑成一张完整的图片. 要实现一个拼图游戏,需要考虑怎样随机的打乱顺序,怎样交换两张图片的位置,等等.但是,使用了Flexbox布局以后 ...

  5. js备忘录5

    函数的全解析 原文链接: http://mp.weixin.qq.com/s?src=11&timestamp=1509672643&ver=491&signature=9fD ...

  6. MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL

    [转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...

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

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

  8. 第五周作业总结(内含用Junit测试ArrayStack和LinkedStack课堂练习报告)

    ---恢复内容开始--- 学号 20162310<程序设计与数据结构>第五周学习总结 教材学习内容总结 集合分为线性集合(集合中的元素排成一行)和非线性集合(按不同于一行的方式来组织元素, ...

  9. A Survey on the Security of Stateful SDN Data Planes

    论文摘要: 本文为读者提供新兴的SDN带状态数据平面,集中关注SDN数据平面编程性带来的隐患. I部分 介绍 A.带状态SDN数据平面的兴起 B.带状态数据平面带来的安全隐患 引出带状态数据平面的安全 ...

  10. Leetcode题库——34.在排序数组中国查找元素的第一个和最后一个位置

    @author: ZZQ @software: PyCharm @file: searchRange.py @time: 2018/11/12 19:19 要求:给定一个按照升序排列的整数数组 num ...