zoukankan      html  css  js  c++  java
  • P4310 绝世好题

    jennie

    怎样处理呢

    (O(n^2))肯定不行

    不如,二进制拆分一下

    这样(do_i)表示第i位为1的最长长度

    对于每一个数,如果他的某一个二进制位为1,那么他可以从之前这一位为1的状态转移过来,然后转移这一位为1的状态

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int f[33];
    int n;
    int x;
    int ans;
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&x);
    		int k=0;
    		for(int j=0;j<=30;++j){
    			if((1<<j)&x) k=max(k,f[j]+1);
    		}
    		for(int j=0;j<=30;++j){
    			if((1<<j)&x) f[j]=max(k,f[j]);
    		}
    		ans=max(ans,k);
    	}
    	cout<<ans;
    	return 0;
    }
    
  • 相关阅读:
    新生题目集
    C语言课程设计
    Java学习-8
    Java学习-7
    Java学习-6
    Java学习-5
    HTML学习
    Java学习-4
    强大的项目管理工具maven
    java学习-3
  • 原文地址:https://www.cnblogs.com/For-Miku/p/15265035.html
Copyright © 2011-2022 走看看