P4310 绝世好题
绝世好题
题目描述
给定一个长度为 的数列 ,求 的子序列 的最长长度 ,满足 ,其中 , 表示位运算取与。
输入格式
输入文件共 2 行。
第一行包括一个整数 。
第二行包括 个整数,第 个整数表示 。
输出格式
输出文件共一行。
包括一个整数,表示子序列 的最长长度。
样例 #1
样例输入 #1
3 1 2 3
样例输出 #1
2
提示
对于100%的数据,,
解析
两个数&不等于0,则这两个数的二进制中至少有一位都是1,我们设表示序列末尾的数二进制下第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'; }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)