码迷,mamicode.com
首页 > 其他好文 > 详细

【LG P4310】绝世好题

时间:2021-07-19 16:38:33      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:进制   好题   span   一个   int   ++   pac   个数   scanf   

分析

\(dp_i\) 表示数列到目前为止最后一项第 \(i\) 位为 \(1\) 的最大子序列长度,每读入一个数时就大力转移。一个数可以被它所有的二进制位的 \(dp\) 值转移,然后把它转移到它的所有二进制位的 \(dp\) 值上。

复杂度 \(O(n\log_2n)\)

代码

#include<bits/stdc++.f>
using namespace std;
int f[32];
int main() {
	int n;
	scanf("%d",&n);
	int ans=0;
	for(int i=1,x; i<=n; i++) {
		scanf("%d",&x);
		int k=1;
		for(int j=0; j<=30; j++) {
			if((1<<j)&x) {
				k=max(f[j]+1,k);
			}
		}
		for(int j=0; j<=30; j++) {
			if((1<<j)&x) {
				f[j]=max(f[j],k);
			}
		}
		ans=max(ans,k);
	}
	printf("%d",ans);
	return 0;
}

参考资料

题解 P4310 【绝世好题】 - wbyyui 的博客 - 洛谷博客

【LG P4310】绝世好题

标签:进制   好题   span   一个   int   ++   pac   个数   scanf   

原文地址:https://www.cnblogs.com/Sam2007/p/15024293.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有
迷上了代码!