bzoj 4300
這題讓我很容易想起了求最長上升子序列,但是直接樸素算法 O( n ^ 2 ) 會超時。
考慮數在 int 范圍內,那只需要保存二進制下某位為 1 的數為結尾的最大長度即可。
#include"cstdio" #include"cctype" #include"algorithm" using namespace std; int read() {int c,x=0; while(!isdigit(c=getchar()));while(x=x*10+c-'0',isdigit(c=getchar()));return x; } int f[31]; int main() {int n=read(),ans=0;for(int i=1;i<=n;i++){int v=read(),now=0;for(int j=0;j<=30;j++) if(v&(1<<j)) now=max(f[j]+1,now);for(int j=0;j<=30;j++) if(v&(1<<j)) f[j]=max(now,f[j]); }for(int i=0;i<=30;i++) ans=max(f[i],ans);printf("%d",ans);return 0; }?
轉載于:https://www.cnblogs.com/woshiyuao/p/8472992.html
總結
- 上一篇: js拖拽
- 下一篇: Monkey Test - 命令