按位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 c=getchar();
    while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();
    k*=f;
}
int main()
{
    read(n);
    for(int i=1;i<=n;i++)
    {
        read(x);mx=0;
        for(int j=0;j<=30;j++)
        if(x&(1<<j))mx=max(mx,f[j]+1);
        for(int j=0;j<=30;j++)
        if(x&(1<<j))f[j]=max(f[j],mx);
        ans=max(ans,mx);
    }
    printf("%d\n",ans);
    return 0;
}
View Code

相关文章:

  • 2022-02-27
  • 2021-11-19
  • 2021-07-21
  • 2022-01-04
  • 2021-07-01
  • 2022-01-25
猜你喜欢
  • 2021-10-04
  • 2021-05-17
  • 2022-12-23
  • 2021-12-15
  • 2022-02-19
  • 2021-09-11
  • 2021-11-08
相关资源
相似解决方案