[bzoj4300][绝世好题] (动规)

Description

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

Input

输入文件共2行。

第一行包括一个整数n。

第二行包括n个整数,第i个整数表示ai。

Output

输出文件共一行。

包括一个整数,表示子序列bi的最长长度。

Sample Input

3
1 2 3

Sample Output

2

HINT

n<=100000,ai<=2*10^9

Solution

什么gui

#include <stdio.h>
#include <string.h>
#define MaxBuf 1<<22
#define RG register
#define inline __inline__ __attribute__((always_inline))
#define Blue() ((S==T&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S==T))?0:*S++)
#define dmax(a,b) ((a)>(b)?(a):(b))

char B[MaxBuf],*S=B,*T=B;

inline void Rin(RG int &x) {
  x=0;RG int c=Blue(),f=1;
  for(; c<48||c>57; c=Blue())
    if(c==45)f=-1;
  for(; c>47&&c<58; c=Blue())
    x=(x<<1)+(x<<3)+c-48;
  x*=f; }

int n,x,ans,f[31];

int main() {
  Rin(n);
  while(n--) {
    register int t=0;
    Rin(x);
    for(register int i=0; i<=30; i++)
      if(x&(1<<i))
    t=dmax(f[i]+1,t);
    for(register int i=0; i<=30; i++)
      if(x&(1<<i))
    f[i]=t;
    ans=dmax(ans,t); }
  printf("%d\n",ans);
  fclose(stdin);
  return 0; }
时间: 2024-08-01 10:42:34

[bzoj4300][绝世好题] (动规)的相关文章

bzoj4300绝世好题

bzoj4300绝世好题 题意: 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0.n≤100000,ai≤10^9. 题解: 用f[i]表示当前二进制i为1的最长子序列长度.每次求所有((1<<i)&bi)==1的f[i]最大值max,将所有((1<<i)&bi)==1的f[i]变为max+1. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #incl

bzoj4300 绝世好题(位运算+DP)

为什么要写这道题呢?因为它是"绝世好题". 题意:给定n个数,在其中找出一段子序列b,使得b[i]&b[i-1]!=0,求出满足条件的最长子序列长度. 输入:第一行:一个整数n,表示数列的个数. 第二行:n个整数,表示数列a. 输出:一行,一个整数,表示最长的子序列长度. 输入样例: 3 1 2 3 输出样例: 2 解析:若b[i]&b[i-1]!=0,即b[i]与b[i-1]在二进制下有一位相同且都为1.那么设dp[i]表示前i个数所能达到的最长子序列长度,那么在转移

bzoj4300: 绝世好题

用一个数组E[32]记录该位是1的最后一个数的编号,读入一个数之后更新. http://www.lydsy.com/JudgeOnline/problem.php?id=4300 /************************************************************** Problem: 4300 User: 1349367067 Language: C++ Result: Accepted Time:80 ms Memory:1196 kb ********

bzoj4300: 绝世好题(DP)

按位DP f[i]表示第i位为1的最长子序列 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> #define ll long long using namespace std; int n,x,ans,mx; int f[31]; void read(int &k) { int f=1;k=0;char

2011 ACM-ICPC 成都赛区A题 Alice and Bob (博弈动规)

题目大意: 有K堆石子,每堆有Ki个.两人的操作能够是: 1 从某一堆拿走一个 假设该堆在此之后没有石子了.就消失 2 合并两个堆 求是否先手必胜,先手胜输出Alice.否则输出Bob 思路: 这道题读完后毫无头绪.推了半天也推不个所以然来,參看大神代码后,感觉就是一个记忆化搜索啊,唉,知识学多了不会用还是白搭.还得多做题啊! 这里我们把数字分成 1,2,大于等于3的奇数,大于等于4的偶数四类. 这样分的原因在于.一个大于3的奇数是实际上等价于3的:由于每当对手减一个.自己也减一个.就又变回了一

【字符串处理+动规】单词的划分

[字符串处理+动规]单词的划分 Time Limit: 1000MS Memory Limit: 2560KB 有一个很长的由小写字母组成字符串.为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词.出于减少分析量的目的,我们希望划分出的单词数越少越好.你就是来完成这一划分工作的. 输入格式 第一行,一个字符串.(字符串的长度不超过100)     第二行一个整数n,表示单词的个数.(n<=100)     第3~n+2行,每行列出一个单词. 输出格式     一个整数,

【线性动规】最大子段和

题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000的整数A[i],描述了这段序列. 输出格式: 输入文件maxsum1.out仅包括1个整数,为最大的子段和是多少.子段的最小长度为1. 输入输出样例 输入样例#1: 7 2 -4 3 -1 2 -4 3 输出样例#1: 4 说明 [样例说明]2 -4 3 -1 2 -4 3 [数据规模与约定] 对于

[bzoj4247][挂饰] (动规+排序)

Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直接挂在手机上,要么挂在其他挂件的挂钩上.直接挂在手机上的挂件最多有1个. 此外,每个挂件有一个安装时会获得的喜悦值,用一个整数来表示.如果JOI君很讨厌某个挂饰,那么这个挂饰的喜悦值就是一个负数. JOI君想要最大化所有挂饰的喜悦值之和.注意不必要将所有的挂钩都挂上挂饰,而且一个都不挂也是可以的.

【BZOJ1010】【HNOI2008】玩具装箱toy 动规_斜率优化

第一道斜率优化题,题解仍然不是很透彻. 我在这里可以推荐一篇博客. http://blog.sina.com.cn/s/blog_5f5353cc0100jx41.html 写得还好,但是可能有一些地方仍说的不是很明白. 我说一下我对斜率优化的理解: 就是发现某道动态规划的题会TLE,然后它又恰巧符合某些丧心病狂的性质时的一种优化. 本质是有限度地捏造出一种性质,使得动规方程满足某种邪恶的单调性,从而得到大幅度的优化. 而这个单调性是怎么得到的呢? 就是我们把原转移状态搞出来,一顿转化,比如把平