P4310 绝世好题

绝世好题

题目描述

给定一个长度为 n 的数列 ai,求 ai 的子序列 bi 的最长长度 k,满足 bi&bi10,其中 2ik& 表示位运算取与。

输入格式

输入文件共 2 行。
第一行包括一个整数 n
第二行包括 n 个整数,第 i 个整数表示 ai

输出格式

输出文件共一行。
包括一个整数,表示子序列 bi 的最长长度。

样例 #1

样例输入 #1

3
1 2 3

样例输出 #1

2

提示

对于100%的数据,1n100000ai109

解析

两个数&不等于0,则这两个数的二进制中至少有一位都是1,我们设fi表示序列末尾的数二进制下第i位为1的最大长度(可能有点不好理解),对于每个数x,枚举他的每个二进制位,如果为1,则可以转移。
本题的DP有点神奇且抽象,思维难度还是比较高的。

代码

#include <bits/stdc++.h>
using namespace std;
int f[35], ans;
int main() {
int n; cin >> n;
for (int i = 1; i <= n; i ++) {
int x; cin >> x;
int k = 0;
for (int j = 0; j <= 30; j ++)
if ((1 << j) & x) k = max(k, f[j] + 1);
for (int j = 0; j <= 30; j ++)
if ((1 << j) & x) f[j] = k;
ans = max(ans, k);
}
cout << ans << '\n';
}

image



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   YHXo  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示