P4310 绝世好题 拆位dp
作者:
多米尼克領主的致意
,
2024-05-24 16:31:11
,
所有人可见
,
阅读 6
f[j]定义为当前i中 第j位的最大二进制为1子序列数量
题意要求bi & bi-1 !=0 那么显然每位的最大值f可以转移到任意一位 1的个数不为0的位上
因为只需要相邻两数与不为0即可 偏思维题
O(nlogai)
容易理解错题意
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int f[33], a[N];
int mx = 0;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++)cin >> a[i];
for(int i = 1;i <= n;i++){
mx = 0;
for(int j = 0;(1 << j) <= a[i];j++){
if(a[i] & (1 << j)){
f[j] = max(mx, f[j] + 1);
mx = max(mx, f[j]);
}
}
for(int k = 0;(1 << k) <= a[i];k++){
if(a[i] & (1 << k)){
f[k] = mx;
}
}
}
int ans = 0;
for(int i = 0;i <= 32;i++){
ans = max(ans, f[i]);
}
cout << ans;
return 0;
}