P4310 绝世好题(带位运算的DP)题解

题解:洛谷 P4310 绝世好题 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。包括一个整数,表示子序列。#普及+# #线性DP-一维#本文分享的必刷题目是从。 阅读详情

O(n ^ 2) 的类似最长上升子序列的做法

这个题其实乍一看非常像最长上升子序列这种题: 都是找一段最长的子序列 ,于是就有了如下90分的代码:

// web:
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
const int INF = 1e18;

// int dp[32];
int a[N], dp[N];

inline void solve()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i], dp[i] = 1;
    int res = 1;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j < i; j++)
        {
            if (a[j] & a[i])
                dp[i] = max(dp[i], dp[j] + 1);
            res = max(res, dp[i]);
        }
    cout << res << endl;
}

signed main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int t = 1;
    // cin >> t;
    while (t--) solve();
    return 0;
}

优化(重点)

动态规划集合的设计

对于 & 操作,可以想到只要 其中的一位为1 ,那么就可以接上前面的同样该位为 1 的数字,那么dp数组可以设计成二维的 dp[i, j], 代表以第 i 个数字结尾,并且只考虑 第j位 是否满足条件的所有子序列的集合,其中数组存储的值就是子序列长度的 最大值;

动态规划转移的设计

那么我们该如何考虑转移呢?对于 第 i 个数字,若其第 j 为1,那么他一定可以接上前面的第 j 位同样为1的数字,所以 当第j位为1的时候 dp[i, j] = dp[i - 1, j] + 1;但是我们最终不只是仅仅考虑第 j 位,我们考虑的是第 i 个数是否能接上之前的,并且找到最大值,所以: 第i个数字的最大值就是所有位数里面的最大值,即k = max(dp[i, j]); 这个时候,我们还要再进行一步操作,把所有位上位1的数更新成k,为什么呢? 可以想一下在第i + 1个数的时候,如果第i + 1个数和第i个数的第j位为1的时候,那么他的值就是从第i个数的第j位转移过去的;如果第i + 1个数的第j位为1但是第i个数的第j位不是1的时候,那么这个位置就是从第i - 1(或之前的)转移过去的;

最后再用一下滚动数组,最终代码就是这样:

// web:https://www.luogu.com.cn/problem/P4310
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
const int INF = 1e18;

inline void solve()
{
    int n;
    cin >> n;

    vector<int> dp(32, 0);
    int ans = -1;
    for (int i = 1; i <= n; i++)
    {
        int b;
        cin >> b;

        int k = 1;
        for (int j = 0; j <= 30; j++)
            if ((1 << j) & b)
                k = max(dp[j] + 1, k);
        for (int j = 0; j <= 30; j++)
            if ((1 << j) & b)
                dp[j] = k;
        ans = max(ans, k);
    }
    cout << ans;
}

signed main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int t = 1;
    // cin >> t;
    while (t--) solve();
    return 0;
}

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

相关推荐

历年CSP-J(NOIP普及组)考点分析与分类汇总(纯干货)

noip/csp-j历年真题考点分类

weixin_42358969的博客 1万+

洛谷P4310 绝世好题

如果a[i]的第j为0,则就不能构成新的子序列,我们直接取a[i-1]的值,此时我们称这一位为不合法。说了这么多,可能还是不够直观(当然是因为讲题人太菜了),我们直接来看代码可能会更好理解。考虑到暴力解法会超时,我们进行优化,根据题意,我们可以进行二进制优化。,满足 $b_i & b_{i-1} \ne 0 $,其中。确定好大致思路,我们就要开始解决一些细节问题。包括一个整数,表示子序列。基础的最长上升子序列问题。输入文件共 2 行。对于100%的数据,

qq_73329099的博客 375

VisualStudio2022启动报错

把Users\...\AppData\Local\Microsoft\VisualStudio\11.0\ComponentModelCache中的Microsoft.VisualStudio.Default.cache这个文件移除,再重启vs,各项功能都能正常使用了。第一次使用方法1有效果,不知道什么原因后面又报错再删除缓存文件无效了,最后使用方法2启动VS成功。vs2022启动时,报错弹框,在ActivityLog查看具体报错信息,报错原因未知。网上搜索到两种解决方法。方法1:删除缓存文件。

面朝大海,春暖花开 3938

【线性dp】P4310 绝世好题

若设状态,f【i】表示以i结尾的最长序列的话,显然有n^2的转移方程,但会tle。结合位运算的性质,当前节点只能从它的二进制表示中某一位为1的状态转移而来(保证位与不等于0),所以可以把状态设为f【i】表示二进制下以第i位为1结尾的最长序列,那么当前a【i】的贡献是只会去更新它的二进制位上为1的位置的答案,然后再循环一下把a【i】为1的位置的答案跟新为能转移而来的最大值。

qq_63760095的博客 298

一文读懂,WMS仓库管理系统模块功能

对于仓库管理人员来说,仓储管理是一件需要十分负责、又精细化的工作。

深蓝易网的博客 5219

5分钟搞定阿里云千问大模型API申请:手把手教你获取API Key

本文提供了一份高效的阿里云通义千问大模型API Key获取实战指南。通过清晰的步骤,帮助开发者在五分钟内完成从账号准备、精准导航控制台到创建并验证API Key的全过程,并强调了密钥安全管理和基础调用测试的重要性,助力快速集成AI能力。

ol789012345的博客 1345

【状态设计优化DP】P4310 绝世好题

DP优化

weixin_62528401的博客 1020

【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用方法、阅读顺序、创新思路、文章汇总、源码汇总、数据集汇总等。总之,【图像拼接论文相关】看这一篇就够了

为什么会有这篇文章?因为专栏简介里写不下太多东西,只能通过这篇文章和大家交流,算是一个专栏阅读指南吧。说点心里话本来吧,我只想用优快云来记录自己学习【图像拼接】领域论文的过程,对每篇文章有个细致的理解,方便自己反复查阅。设置为付费也是因为涉及论文和本人其他项目需要,防止查重和其他问题,所以价格最开始设置的是专栏付费价格里最高的。起初,确实没有人看,一切也都平淡地度过着。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4万+

线性dp P4310-绝世好题/P4933 大师【日记】

这道题我想了好一会儿,想到用创建一个f[1000][40000]大小的数组用来存每一个位置的差,这样一来,用一个n方复杂度的算法就可以全部遍历一遍。这种想法在我看到数据后戛然而止,于是直到最后我都没有再出现其他的思路。但是没有想到,f[1000][40000]占用内存并不多。一开始看错题,以为是求子串(还在想为啥考的纯位运算+枚举,比较考验思维的一道题目,码量和理解难度都不大,重在思维。后面发现是求子序列,犯难,只能想到n方的方法。写题的时候学习了一下空间大小的计算方式。多模拟模拟,该题还是有思维难度的。

why_not_fly的博客 756

8、使用 TPCx - HCI 基准测试表征 HCI 集群的性能和弹性

本文详细介绍了 TPCx - HCI 基准测试,用于衡量超融合基础设施(HCI)集群的性能、稳定性和扩展性。TPCx - HCI 扩展了 TPCx - V 的理念,通过 Tile 架构和弹性特性,全面评估硬件、虚拟化、存储和网络组件的表现。文章还通过多个实验场景分析了负载均衡、数据布局和重新同步策略对性能的影响,并提出了部署和优化 HCI 集群的建议。

sun99的博客 179

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C++】51 nod 3179(洛谷 P4310) 绝世好题

好久没上刷题了,今天看到一道题,名字叫“”,于是就想挑战一下(做完后想看一下里头有没有,结果真查到了,题目是一样的)

小 P 的博客 400

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

洛谷 P4310 绝世好题 题解

(二进制下) 的数的个数,每次输入一个数,就需要更新一遍。(二进制下) ,那么我们就可以用一个数组。包括一个整数,表示子序列。,直至最后找到最大的。输入文件共 2 行。对于100%的数据,

xiaolongmeiya的博客 1757

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

洛谷【动态规划2】线性状态动态规划 题解13-16 详细易懂不炫技

在这里主要是学到了一次背包和若干次背包的区别,若干次就是在前面套一个n次的循环。

xinghuayu_lin的博客 150

洛谷 P4310绝世好题

洛谷 P4310绝世好题,对于dp状态表示和更新值maxn的详细介绍

weixin_59867637的博客 701

BZOJ4300 || 洛谷P4310 绝世好题【DP】

Time Limit: 1 Sec Memory Limit: 128 MB Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&amp;amp;bi-1!=0(2&amp;lt;=i&amp;lt;=len)。 Input 输入文件共2行。 第一行包括一个整数n。 第二行包括n个整数,第i个整数表示ai。 Output 输出文件共一行。 包括一个整数,表示子序列bi的最长长度。 ...

niiick 428

洛谷 P4310 绝世好题

Description 思路 由题目条件 bi&bi−1≠0b_i \&b_{i-1} \neq 0bi​&bi−1​​=0,可以得到:只要两个数的二进制展开中,在任意一位相同的二进制位上,两个数都为1,那么与运算之后结果就一定不为0。 考虑到 n≤100000n\leq100000n≤100000,无法使用类似常规的最长不降子序列的做法,我们可以利用位运算的特点——不同二进制位之间的位运算相互独立,来将各个二进制位分开进行统计以此加快效率,这也是位运算题目中经常使用的技巧。 例

群山中的菜鸡 572

BZOJ4300 绝世好题

传送门 题目大意,给定n,{an},求a的一个最大子序列bn,使得bi&b(i-1)!=0.求最大的|b| 题解:显然是DP,状态转移方程显然是dp[n]=max{dp[k]+1},a[n]&a[k]!=0 考虑优化,发现和LIS有点类似。 LIS有个线段树优化就是暴力的记录最后的数字(显然是最大的)对应的最长的序列是多长,这样离散化一下每次询问前缀最大值。 这个题的优化类似,发现a&b

Mys_C_K的博客 1078

洛谷P4310 绝世好题 题解

description: 给定一个长度为n的数列ai,求ai的子序列bi的最长长度len,满足bi给定一个长度为n的数列ai,求ai的子序列bi的最长长 度len,满足b_i给定一个长度为n的数列ai,求ai的子序列bi的最长长度len,满足bi​ andandand bi−1!=0(2≤i≤len)b_{i−1} != 0(2 ≤ i ≤ len)bi−1​!=0(2≤i≤len) n≤105n...

ShineEternal的笔记小屋 747

洛谷P4310 绝世好题-dp

dp[i]表示子序列中末尾数在二进制表示下,第i位为1的最大长度 状态转移方程: dp[i] = max( dp[j]+1 , 1 ) (1<<(j-1))&a[i] !=0 且 (1<<(i-1))&a[i]!=0

weixin_50836068的博客 380

luogu P4310 绝世好题

题面传送门 这道dpdpdp还是比较水的 首先考虑设fif_ifi​为以aia_iai​结尾的最长长度,则向前循环枚举找到适合的转移就可以了,时间复杂度O(n2)O(n^2)O(n2),估计808080分 正解也不是很难想,因为这是位运算,所以我们要找到位运算的性质,&\&&的性质就是两个数至少有一个相同位置同为111,那么只要枚举位置转移就好了,设sis_isi​为结尾的...

fxt275307894a的博客 326

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 197

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 307

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 567

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20
上一篇: 动态规划之合唱队形
下一篇: 动态规划之背包才是万恶之源(CF E. K Balanced Teams)
ResCells
博客等级 码龄4年 191粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值