卧薪尝胆,厚积薄发。
绝世好题
Date: Mon Jul 16 17:18:48 CST 2018 In Category: NoCategory

Description:

给定一个长度为 $n$ 的数列 $a_i$ ,求 $a_i$ 的子序列 $b_i$ 的最长长度,满足 $b_i\&b_{i-1}\ne 0$ 。
$1\le n \le100000$

Solution:

发现只要两个数有一位都是一就符合条件,于是设计状态为 $f[i]$ 表示到当前为止第 $i$ 位为一的最长长度,那么对于当前这个数,如果第 $k$ 位为 $1$ ,那么就可以从 $f[k]$ 转移过来,也可以转移到 $f[k]$ ,于是记录一个最大值即可。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int f[31];
int n;
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;++i)
{
int t,cnt = 0;
scanf("%d",&t);
for(int k = 0;k <= 30;++k)
{
if(t & (1 << k))cnt = max(cnt,f[k] + 1);
}
for(int k = 0;k <= 30;++k)
{
if(t & (1 << k))f[k] = max(f[k],cnt);
}
}
int ans = 0;
for(int k = 0;k <= 30;++k)
{
ans = max(ans,f[k]);
}
cout << ans << endl;
return 0;
}
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡