O(n2) 级别的 dp 加点剪枝就过了?还跑得贼快?
建议 hack 以下的代码
#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define I_love_Foccarus return
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define deap(i,a,b) for(int i=b;i>=a;i--)
#define in(a) a=read()
#define fi first
#define se second
const int N = 1e5 + 5;
const int inf = INT_MAX;
inline int read() {
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9') {
x=x*10+ch-48;
ch=getchar();
}
I_love_Foccarus x*f;
}
void fast() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
int a[N],dp[N],ans;
signed main() {
//fast();
int n;
in(n);
rep(i,1,n)in(a[i]);
dp[1]=1;
rep(i,2,n) {
int tmp=0;
deap(j,1,i-1){
if((a[i]&a[j])!=0) {
tmp=max(tmp,dp[j]);
}
if(j<tmp)break;
}
dp[i]=tmp+1;
ans=max(ans,dp[i]);
}
cout<<ans;
I_love_Foccarus 0;
}