4300: 绝世好题

来源:互联网 发布:pr文艺小清新调色数据 编辑:程序博客网 时间:2024/04/28 20:14

题目链接

题目大意:给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)

O(n2)lis
考虑转移条件为aj&ai0ajai的二进制至少有一位同时为1,f[i]表示最后一个数二进制第i位为1的最优解,……于是枚举的复杂度降到了log,注意要把所有为1的二进制位更新成总最优值……因为有一位同时为1就可以了……然后就可以O(nlogai)来做了

我的收获:

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>using namespace std;int n,x,temp;int f[33];void work(){    int ret=0;    for(int i=0;i<=30;i++) ret=max(ret,f[i]);    printf("%d\n",ret);}void init(){    scanf("%d", &n);    for(int i=1;i<=n;i++){        scanf("%d",&x);temp=0;        for(int j=0;j<=30;j++) if(x&(1<<j)) temp=max(temp,f[j]+1);        for(int j=0;j<=30;j++) if(x&(1<<j)) f[j]=max(f[j],temp);    }}int main(){    init();    work();    return 0;}
原创粉丝点击