HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)
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要求:
\]
这也就是说,如果我们把每一个数都转成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 绝世好题(位运算,递推)的更多相关文章
- BZOJ 4300: 绝世好题 动态规划
4300: 绝世好题 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4300 Description 给定一个长度为n的数列ai,求ai的 ...
- 【递推】BZOJ 4300:绝世好题
4300: 绝世好题 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 564 Solved: 289[Submit][Status][Discuss] ...
- bzoj 4300: 绝世好题 dp
4300: 绝世好题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...
- bzoj 4300: 绝世好题
4300: 绝世好题 Time Limit: 1 Sec Memory Limit: 128 MB Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi& ...
- BZOJ 4300 绝世好题(位运算)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4300 [题目大意] 给出一个序列a,求一个子序列b,使得&和不为0 [题解] ...
- bzoj 4300 绝世好题——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 考虑 dp[ i ] 能从哪些 j 转移过来,就是那些 a[ j ] & a[ ...
- bzoj 4300 绝世好题 —— 思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4300 记录一下 mx[j] 表示以第 j 位上是1的元素结尾的子序列长度最大值,转移即可. ...
- bzoj 4300: 绝世好题【dp】
设f[i][j]表示数列到i为止最后一项第j位为1的最大子序列长度,每次从i-1中1<<j&a[i]!=0的位+1转移来 然后i维是不需要的,答案直接在dp过程中去max即可 #i ...
- BZOJ 4300: 绝世好题 二进制
对于每一个数字拆位,然后维护一个大小为 30 左右的桶即可. code: #include <bits/stdc++.h> #define N 100006 #define setIO(s ...
随机推荐
- mongodb基本使用(一)
1.启动.停止和重启mongodb服务 brew services start mongodb ---启动 brew services stop mongodb --停止 brew services ...
- JavaScript设计模式-----模板方法模式
模板方法模式是一种只需要使用继承就可以实现的非常简单点的模式. 模板方法模式有两部分组成,第一部分是抽象父类,第二部分是具体的实现子类.通常在抽象父类中封装了子类的算法框架,包括实现 一些公共方法以及 ...
- AJAX(Asynchronous JavaScript and XML)学习笔记
基本概念: 1.AJAX不是一种新的编程语言,而是一种使用现有标准的新方法. 2.AJAX最大的优点是在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容,用于创建快速动态网页(传统网页如 ...
- 第35次Scrum会议(11/23)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文小组照片 二.开会信息 时间:2017/11/23 17:03~17:24,总计21min.地点:东北师 ...
- 2-Eighth Scrum Meeting20151208
任务分配 闫昊: 今日完成:和唐彬讨论研究上届的网络接口代码. 明日任务:商讨如何迁移ios代码到android平台. 唐彬: 今日完成:和闫昊讨论研究上届的网络接口代码. 明日任务:商讨如何迁移io ...
- 【Alpha】阶段第八次Scrum Meeting
[Alpha]阶段第八次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 编写按学院搜索课程接口 编写获得所有学院接口 赵智源 构建前测试点测试框架 编写alph ...
- JAVA第一次实验 ——凯撒密码
课程:Java程序设计 班级:1352 姓名:黄伟业 学号:20135215 成绩: 指导教师:娄嘉鹏 实验日期:2015.4.15 实验密级: 预习程度: 实验时间:19: ...
- SEO优化之HTML代码优化最重要的5个标签
众所周知,HTML代码一直是搜索引擎抓取的重点.搜索引擎会将HTML中的某些元素标签作为影响网页排名的重要依据 在我们之前的文章中也或多或少地向大家介绍了有关HTML代码的优化技巧,接下来将系统地讲解 ...
- 【百度】大型网站的HTTPS实践(一)——HTTPS协议和原理
大型网站的HTTPS实践(一)——HTTPS协议和原理 原创 网络通信/物联网 作者:AIOps智能运维 时间:2018-11-09 15:07:39 349 0 前言 百度于2015年上线了全站 ...
- vsftpd重启失败解决方法
vsftpd dead,but subsys locked vsftpd已死,但是subsys被锁 关于VSFTPD服务器重启失败,研究了一晚上,当virtual_use_local_privs=ye ...