一、题目
二、分析
dp[i]表示子序列中末尾数在二进制表示下,第i位为1的最大长度
状态转移方程:
dp[i] = max( dp[j]+1 , 1 )
(1<<(j-1))&a[i] !=0 且 (1<<(i-1))&a[i]!=0
三、代码
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N];
int dp[50];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
int L=1;
for(int j=0;j<=32;j++)
{
if(a[i]&(1<<j))
{
L=max(L,dp[j+1]+1);
}
}
for(int j=0;j<=32;j++)
{
if(a[i]&(1<<j))
{
dp[j+1]=max(L,dp[j+1]);
}
}
}
int Max=0;
for(int i=1;i<=32;i++)
Max=max(Max,dp[i]);
cout<<Max<<endl;
return 0;
}