题意:
给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0。n≤100000,
ai≤10^9。
思路:
dp[i]表示处理到当前数,第i位不为0的最优长度,注意得到最优长度后要给每位为1的地
方的dp都赋值成最优长度,因为与他下一个可以相邻的数只要任意一位相与是1即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[35];
int main(void)
{
int n;
while(cin >> n)
{
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; i++)
{
int t, temp = 0;
scanf("%d", &t);
for(int j = 0; j < 32; j++)
if((t >> j) & 1) temp = max(temp, dp[j]+1);
for(int j = 0; j < 32; j++)
if((t >> j) & 1) dp[j] = max(temp, dp[j]);
}
int ans = 0;
for(int i = 0; i < 32; i++)
ans = max(ans, dp[i]);
printf("%d\n", ans);
}
return 0;
}