当前位置:首页 > 牛客 > 【牛客4456题解析】最长上升子序列的动态规划+二分查找解法

【牛客4456题解析】最长上升子序列的动态规划+二分查找解法

3个月前 (07-16)

【牛客4456题解析】最长上升子序列的动态规划+二分查找解法 最长上升子序列 动态规划 二分查找 牛客题解 C++ 第1张

一、题目解读

牛客4456题要求在一个整数序列中寻找最长上升子序列(LIS)的长度。题目考察的核心是动态规划与高效查找算法的结合,需要设计一种能在给定序列中快速找到最长递增子序列的方法,通常需要平衡时间复杂度和代码简洁性。

二、解题思路

采用动态规划(DP)结合二分查找实现LIS求解。核心思想是:维护一个递增序列dp,每次遍历输入序列A中的元素num,通过lower_bound找到dp中第一个不小于num的位置。若未找到(即num比dp所有元素大),则扩展dp;否则替换该位置元素。由于dp始终递增,其长度即为LIS长度。此优化将时间复杂度从O(N^2)降至O(NlogN)。

三、解题步骤

1. 初始化:创建动态规划数组dp,用于存储递增子序列

2. 遍历输入序列:

○ 对每个元素num,使用lower_bound在dp中查找第一个≥num的位置it。

○ 若it为dp末尾(即num比dp所有元素大),则执行dp.push_back(num),扩展序列。

○ 否则,替换it位置的元素(*it = num),确保dp保持递增且长度最短(因LIS长度相同,但末尾元素更小,后续可容纳更多元素)。

3. 返回结果:dp的长度即为最长上升子序列的长度。

四、代码和注释

class AscentSequence {
  public:
    int findLongest(vector<int> A, int n) {
        vector<int> dp; // 维护一个递增序列
        for (int num : A) { // 遍历输入序列
            // 使用lower_bound找到第一个不小于当前元素的位置
            auto it = lower_bound(dp.begin(), dp.end(), num);
            if (it == dp.end()) { // 未找到(num比dp所有元素大)
                dp.push_back(num); // 扩展序列
            } else { // 找到替换位置
                *it = num; // 替换第一个≥num的元素,保持dp递增
            }
        }
        return dp.size(); // 最终序列长度即为LIS长度
    }
};

五、总结

本解法通过动态规划结合二分查找,将LIS问题的时间复杂度优化至O(NlogN),显著提升效率。关键在于利用递增序列dp的特性,通过替换操作确保其“紧凑性”,从而在查找时可用lower_bound快速定位。该思路不仅适用于面试算法题,也为处理大规模数据的LIS问题提供了实用策略,是动态规划与高级算法结合的典型案例。

原创内容 转载请注明出处

分享给朋友:

相关文章

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

NOIP 2008火柴棒等式题解(C++代码实现)  动态规划与枚举算法详解

NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

一、题目解读火柴棒等式问题(NOIP 2008,洛谷P1149)要求使用给定数量的火柴棒,构造形如 A + B = C 的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式...

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

一、题目解读洛谷P4999题要求处理给定区间 [L, R] 内数字的拆分与求和问题。每个数字需拆分为其各位数字之和,并计算区间内所有数字之和的累加结果。题目需考虑大数情况,并采用取模运算(MOD=1e...

2022 CSP-J 上升点序(洛谷P8816)解题报告:动态规划求解最长上升序列

2022 CSP-J 上升点序(洛谷P8816)解题报告:动态规划求解最长上升序列

一、题目解读2022年CSP-J题目“上升点序”(洛谷P8816)要求给定一个平面点集,每个点的坐标(x,y)均为整数。题目需要构造一个最长的上升序列,序列中相邻点的坐标满足x和y均严格递增。允许使用...

牛客网288555题解题指南:动态规划求解小红的暑假(附代码解析)

牛客网288555题解题指南:动态规划求解小红的暑假(附代码解析)

一、题目解读牛客网288555题要求解决一个组合数学问题:有三位朋友,每天需邀请其中一位参加聚会,但不能连续两天邀请同一位朋友。给定天数n,求满足条件的不同邀请方案总数。题目考察动态规划、状态转移及组...

牛客4580题解:动态规划求解网格路径概率问题(C++代码实现)

牛客4580题解:动态规划求解网格路径概率问题(C++代码实现)

一、题目解读牛客4580题要求在一个n×m的网格中计算从起点(1,1)到终点(n,m)的概率。网格中存在障碍物(标记为坏点),路径只能向右或向下移动。到达终点时,若处于边界位置,概率转移规则不同:下边...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。