当前位置: 首页 > news >正文

豆包 快速 LeetCode 3287. 求出数组中最大序列值 C++实现

LeetCode 3287. 求出数组中最大序列值 C++ 完整实现

题意回顾

给定数组 nums 和整数 k ,选出长度为 2k 的子序列,拆分为前 k 个、后 k 个不重叠部分:

1. 前 k 个数全部按位或得到 A
2. 后 k 个数全部按位或得到 B
3. 求 A ^ B 的最大值

限制条件: nums[i] < 128 ,所有或运算结果值域仅 0~127 ,这是核心优化点。

核心思路

1. 前缀DP: pre[i][j][v] 表示前 i 个元素中选 j 个,按位或等于 v 是否可达
2. 后缀DP: suf[i][j][v] 表示下标 i 到末尾选 j 个,按位或等于 v 是否可达
3. 枚举分割点 split :前 split 个取 k 个, split 之后取 k 个,两段无交集
4. 遍历所有合法 A、B ,计算异或并维护最大值

C++ 标准版代码(可直接提交LeetCode)AC

cpp
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
int maxValue(vector<int>& nums, int k) {
const int MAX_VAL = 128;
int n = nums.size();
k = min(k, n / 2);

// pre[i][cnt][val]:前i个数选cnt个,或值val是否存在
vector<vector<vector<bool>>> pre(n + 1, vector<vector<bool>>(k + 1, vector<bool>(MAX_VAL, false)));
pre[0][0][0] = true;
for (int i = 1; i <= n; ++i) {
int x = nums[i - 1];
for (int cnt = 0; cnt <= k; ++cnt) {
// 不选当前数字,复制上一层状态
pre[i][cnt] = pre[i - 1][cnt];
// 选当前数字,从 cnt-1 转移
if (cnt > 0) {
for (int v = 0; v < MAX_VAL; ++v) {
if (pre[i - 1][cnt - 1][v]) {
pre[i][cnt][v | x] = true;
}
}
}
}
}

// suf[i][cnt][val]:下标i ~ n-1 选cnt个,或值val是否存在
vector<vector<vector<bool>>> suf(n + 1, vector<vector<bool>>(k + 1, vector<bool>(MAX_VAL, false)));
suf[n][0][0] = true;
for (int i = n - 1; i >= 0; --i) {
int x = nums[i];
for (int cnt = 0; cnt <= k; ++cnt) {
suf[i][cnt] = suf[i + 1][cnt];
if (cnt > 0) {
for (int v = 0; v < MAX_VAL; ++v) {
if (suf[i + 1][cnt - 1][v]) {
suf[i][cnt][v | x] = true;
}
}
}
}
}

int ans = 0;
// split 分割点:前split个取k,剩余取k
for (int split = k; split <= n - k; ++split) {
auto& left = pre[split][k];
auto& right = suf[split][k];
for (int a = 0; a < MAX_VAL; ++a) {
if (!left[a]) continue;
for (int b = 0; b < MAX_VAL; ++b) {
if (right[b]) {
ans = max(ans, a ^ b);
}
}
}
}
return ans;
}
};


空间优化版本(滚动数组,节省内存)

原始三维数组内存占用较高,用滚动数组压缩第一维:

cpp
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
int maxValue(vector<int>& nums, int k) {
const int MAX_VAL = 128;
int n = nums.size();
k = min(k, n / 2);

// 前缀滚动DP
vector<vector<vector<bool>>> pre(n + 1, vector<vector<bool>>(k + 1, vector<bool>(MAX_VAL, false)));
vector<vector<bool>> dp(k + 1, vector<bool>(MAX_VAL, false));
dp[0][0] = true;
pre[0] = dp;
for (int i = 1; i <= n; ++i) {
int x = nums[i - 1];
auto cur = dp;
for (int cnt = 1; cnt <= k; ++cnt) {
for (int v = 0; v < MAX_VAL; ++v) {
if (dp[cnt - 1][v]) {
cur[cnt][v | x] = true;
}
}
}
dp.swap(cur);
pre[i] = dp;
}

// 后缀滚动DP
vector<vector<vector<bool>>> suf(n + 1, vector<vector<bool>>(k + 1, vector<bool>(MAX_VAL, false)));
fill(dp.begin(), dp.end(), vector<bool>(MAX_VAL, false));
dp[0][0] = true;
suf[n] = dp;
for (int i = n - 1; i >= 0; --i) {
int x = nums[i];
auto cur = dp;
for (int cnt = 1; cnt <= k; ++cnt) {
for (int v = 0; v < MAX_VAL; ++v) {
if (dp[cnt - 1][v]) {
cur[cnt][v | x] = true;
}
}
}
dp.swap(cur);
suf[i] = dp;
}

int ans = 0;
for (int split = k; split <= n - k; ++split) {
auto& left = pre[split][k];
auto& right = suf[split][k];
for (int a = 0; a < MAX_VAL; ++a) {
if (!left[a]) continue;
for (int b = 0; b < MAX_VAL; ++b) {
if (right[b]) {
ans = max(ans, a ^ b);
}
}
}
}
return ans;
}
};


复杂度说明

1. 时间复杂度:O(n \cdot k \cdot 128 + n \cdot 128^2)
- 前后缀DP:O(nk \cdot 128)
- 枚举分割点求最大异或:O(n \cdot 128^2)
2. 空间复杂度:标准版 O(nk \cdot 128);滚动优化版内存减半

关键细节

1. MAX_VAL = 128 :题目保证 nums[i] < 128 ,任意数字或运算结果不会超过127;
2. 分割点范围 [k, n-k] :保证左右两边都能选出k个数字;
3. 状态转移:复制上一层表示不选当前数,循环或更新表示选当前数;
4. 最终遍历所有 a,b 组合求异或最大值。

http://www.gsyq.cn/news/1549740.html

相关文章:

  • 2026豆包GEO公司选型评测:谁在为AI搜索流量造血? - 品牌报告
  • 温岭附近疏通下水道/同城口碑温岭通诚管道疏通推荐,2026年 温岭物品打捞/厕所疏通哪家专业 - 资讯速览
  • 0618晨间日记
  • E9 微搜密码存放文件位置/内存文件
  • 不锈钢焊接代加工百科:工艺、场景与选型全指南 - 起跑123
  • 游客视角下长沙正餐消费选址逻辑与品牌适配研究 - 资讯速览
  • 2026黄金奢侈品回收平台综合测评榜单:多维对比助力闲置黄金安心变现 - 奢侈品回收评测
  • 2026广州黄金回收避坑手册:记住这5条黄金法则,谁也别想坑你 - 奢侈品回收评测
  • 东莞黄金回收测评2026|正规门店报价透明,半小时极速上门 - 奢侈品回收测评
  • 机器学习过拟合:从原理到工业级防御实战指南
  • 2026 杭州黄金回收避坑:报价高于大盘全是套路,内行教你到手价最大化技巧 - 奢侈品回收评测
  • 2026免费在线视频转MKV保姆级教程|多音轨/字幕全保留,手机+电脑全覆盖 - 时时资讯
  • 【小白也能轻松用】轻量化智能体部署,OpenClaw v2.7.9电脑通用安装教程(含最新安装包)
  • 老杭州实测 2026 全城黄金回收:主城 + 近郊门店摸底,哪家出价透明、无套路最划算 - 奢侈品回收评测
  • 武汉宠物店推荐清单,买猫买狗前先收藏 - 园友3800037
  • 南京宠物店合集,想买猫狗的朋友可以看看 - 园友3800037
  • 2026推荐:40Cr钢板切割厂家/合金板定尺加工 - 资讯速览
  • Notebook到生产环境的MLOps交付实战指南
  • 香奈儿包包回收门店避坑指南|认准资质齐全的商家,拒绝隐形扣费 - 奢品小当家
  • 武汉实测靠谱宠物店推荐,本地买宠可以参考 - 园友3800037
  • 上海家庭防水补漏首选:5 家响应快售后好的正规品牌 - 起跑123
  • 2026佛山黄金回收高性价比机构甄选|全品类回收+专业鉴定测评 - 奢侈品回收测评
  • 上海餐饮厨房排烟工程施工,连锁饭店、火锅店全套排烟管道定制 - 品牌优选官
  • 数据科学中的算法偏见与公平性实践指南
  • 多模态大模型工程落地:跨模态对齐与视觉编码器实战指南
  • 设备基础空鼓不解决,机器抖坏精密零件?昆山陆家这3类注浆单位千万别碰 - 资讯速览
  • 生产级机器学习服务稳定性与可观测性实战
  • 机器学习模型服务化实战:从Notebook到生产环境的17个关键断点
  • 2026重庆财税咨询机构最新评测:四家服务商核心维度对比 - 起跑123
  • 跨平台iOS应用包下载工具IPATool的技术实现与应用实践