L
u
o
g
u
l
i
n
k
\textcolor{pink}{Luogu~link}
Luogu link
分析:
有一个简单 d p dp dp 跟 L I S LIS LIS求法类似
for(register int i=1;i<=n;i++)
{
f[i]=1;
for(register int j=1;j<i;j++)
if((a[i]&a[j])^0)
f[i]=max(f[i],f[j]+1);
ans=max(ans,f[i]);
}
但是会
T
T
T
由于
a
&
b
≠
0
a\&b≠0
a&b=0 说明有一位是
1
1
1 那就设
f
i
f_i
fi表示第
i
i
i 位为
1
1
1的最长长度
记
m
a
x
n
maxn
maxn 表示
m
a
x
{
f
i
}
+
1
max\{f_i\}+1
max{fi}+1 再更新
f
i
f_i
fi 最后答案就是
m
a
x
{
f
i
}
max\{f_i\}
max{fi}
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=35;
int n,f[N],ans;
int main(){
scanf("%d",&n);
for(register int i=1,x;i<=n;i++)
{
scanf("%d",&x);
int maxn=1;
for(register int j=0;j<=30;j++)
if(x&(1<<j)) maxn=max(maxn,f[j]+1);
for(register int j=0;j<=30;j++)
if(x&(1<<j)) f[j]=max(f[j],maxn);
}
for(int i=0;i<=30;i++)
ans=max(ans,f[i]);
printf("%d",ans);
return 0;
}