BZOJ4300 绝世好题

mac2022-06-30  103

目录

BZOJ4300 绝世好题题解code

BZOJ4300 绝世好题

题目传送门

题解

比较简单的\(DP\),记\(f[i]\)表示第\(i\)位为1,最长的长度为多少。只需要枚举每一个数字,对于这个数字二进制下为1的那一位进行更新就行了。

code

#include <bits/stdc++.h> using namespace std; typedef long long ll; bool Finish_read; template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;} template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x+'0');} template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');} template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);} /*================Header Template==============*/ const int maxn=1e5+500; int n; int a[maxn]; int f[40]; /*==================Define Area================*/ int main() { read(n); for(int i=1;i<=n;i++) { read(a[i]); } for(int i=1;i<=n;i++) { int p=a[i]; int len=0; for(int j=0;j<=30;j++) { if(p&(1<<j)) len=max(len,f[j]+1); } for(int j=0;j<=30;j++) { if(p&(1<<j)) f[j]=len; } } int ans=0; for(int i=0;i<40;i++) { ans=max(ans,f[i]); } printf("%d\n",ans); return 0; }

转载于:https://www.cnblogs.com/Apocrypha/p/9431657.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)