写了个O(n2)复杂度的暴力dp,优化了一下:先判断能否由i之前的最大值转移而来,再去枚举j,每次记录一下min(fi)
#include<bits/stdc++.h>
#define dbug(x) cerr<<(#x)<<':'<<(x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define ff(i,a,b) for(int i=a;i>=b;i--)
#define maxn 100099
using namespace std;
int a[maxn],f[maxn];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i];
f[1]=1;
int maxf=0,maxidx=0;
for(int i=2; i<=n; i++) {
if(a[maxidx]&a[i]) {
f[i]=f[maxidx]+1;
} else {
for(int j=1; j<i; j++) {
if(a[i]&a[j])f[i]=max(f[i],f[j]+1);
}
}
if(f[i]>maxf) {
maxf=f[i];
maxidx=i;
}
}
// f(i,1,n)cout<<f[i]<<' ';
int ans=0;
f(i,1,n)ans=max(ans,f[i]);
cout<<ans;
cout<<flush;
return 0;
}
没开O2过了
