1921: B
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 200 Solved: 13
Submit Status Web Board
Description
给定一个长度为n的数字序列a,从中选取一个长为m的子序列b满足 b[i]&b[i-1]!=0 (2<=i<=m)
求最大的m。
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据第一行输入一个整数n代表a序列的长度,接下来一行输入n个正整数表示ai(0<i<=n)。
1<=t<=20,0<=n<=100000,0<=ai<=1e9。
Output
一个整数表示最大的m。
Sample Input
Sample Output
HINT
Source
这题真的很考验智商,首先给的是子序列,虽然题目没有说是否连续但是交的答案比结果大说明应该是可以分散的,,,,一定要及时改正错误思想
这题非常类似最长上升子序列的思想,前提要对位运算的实质掌握的很透彻,用一个DP数组表示下标为i的二进制位是1的最长长度,然后更新数组
的思想相当于在中间转换了值
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 30;
int dp[N];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, x, ans;
scanf("%d", &n);
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
scanf("%d", &x);
ans=0;
for(int j=0;j<=30;j++)
{
int h=x&(1<<j);
if(h!=0)
{
ans=max(dp[j],ans);
}
}
ans+=1;
for(int j=0;j<=30;j++)
{
if((x&(1<<j))!=0)
{
dp[j]=ans;
}
}
}
ans=0;
for(int i=0;i<=30;i++)
{
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}