题解 P4310 【绝世好题】
绝对好题
Solution
这道题目的九十分做法非常好做, 然而我用一种非常鬼畜的思路A了过去, 而且只用了44ms.
先介绍一下90分做法, 用
所以这是一个所有人都可以想到的转移, 但是只能得到90分.
其实每次都枚举一遍j是非常浪费时间的, 而且我们知道
只是没想到这样做的效果那么好, 竟然直接通过了…….
Code
#include<cstdio>
#define N 200005
int max(int i,int j){
return i>j?i:j;
}
int n;
int s[N];
int f[N];
int ma[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&s[i]);
for(int i=1;i<=n;++i)f[i]=1;
for(int i=1;i<=n;++i){
for(int j=i-1;j;--j){
if(f[i]>ma[i-1])break;
if(s[i]&s[j])f[i]=max(f[i],f[j]+1);
}
ma[i]=max(ma[i-1],f[i]);
}
printf("%d",ma[n]);
return 0;
}