当前位置: 代码迷 >> 综合 >> BZOJ 4300 绝世好题
  详细解决方案

BZOJ 4300 绝世好题

热度:87   发布时间:2024-01-19 02:27:05.0

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

HINT

n<=100000,ai<=2*10^9


Source

By Oxer

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DP+位运算~

出题人可能是UC的编辑……

因为只要有一位是1,最终的结果就!=0,所以按位计算每一位的最大结果记录在a[i]中,更新答案即可。


#include<cstdio>
#include<iostream>
using namespace std;int n,a[32],x;int main()
{scanf("%d",&n);while(n--){scanf("%d",&x);int now=0;for(int i=0;i<=31;i++)if(x&(1<<i)) now=max(now,a[i]+1);for(int i=0;i<=31;i++)if(x&(1<<i)) a[i]=max(a[i],now);}for(int i=0;i<=31;i++) n=max(n,a[i]);printf("%d\n",n);return 0;
}