绝世好题
Posted wwlwqwq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绝世好题相关的知识,希望对你有一定的参考价值。
因为涉及到位运算,所以考虑按位处理。
用 (dp[i][j]) 表示当前考虑用前 (i) 个数组成序列,最后一个数的二进制下第 (j) 位是 (1) 的最长序列的长度。
需要满足 (b_i&b_{i+1} e 0) ,就要保证 ((1<<k)&a_i e 0),(k) 为上一个数的第 (k) 位。
方程就容易写出 [dp[i][j]=max{dp[i-1][k]+1 | (1<<j)&a_i>0,(1<<k)&a_i>0}]
然后第一维可以滚掉,直接写成 (dp[j])
Code:
#include<stdio.h>
#define N 100007
int n;
int a,f[35],maxx=0;
inline int max(int x,int y){return x>y? x:y;}
inline void read(int &x){
x=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
}
int main(){
read(n);
for(int i=1;i<=n;i++){
read(a);
int rest=1;
for(int j=30;j>=0;j--)
if(a&(1<<j)) rest=max(f[j]+1,rest);
for(int j=30;j>=0;j--)
if(a&(1<<j)) f[j]=max(rest,f[j]);
}
for(int i=0;i<=30;i++)
maxx=max(maxx,f[i]);
printf("%d",maxx);
}
以上是关于绝世好题的主要内容,如果未能解决你的问题,请参考以下文章