经典算法 最长单调递增子序列

最长单调递增子序列

问题描述

找出由n个数组成的序列的最长单调递增子序列。

示例输入

in 复制代码
9
2 1 5 3 6 4 8 9 7

示例输出

out 复制代码
5

示例输入

in 复制代码
6
5 6 7 1 2 8

示例输出

cpp 复制代码
4

c++代码(动态规划 O(n^2))

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

int main() {
    int n, ans = 0;
    cin >> n;
    vector<int> arr(n), dp(n, 1);
    for (int i = 0; i < n; i++) cin >> arr[i];
    for (int i = 0; i < n; i++) {
        for (int j = i - 1; j >= 0; j--) {
            if (arr[i] > arr[j]) dp[i] = max(dp[i], dp[j] + 1);
        }
    }
    for (int i = 0; i < n; i++) ans = max(ans, dp[i]);
    cout << ans;
    return 0;
}

c++代码(贪心+二分 O(nlogn))

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) cin >> arr[i];
    vector<int> ans;
    for (int i = 0; i < n; i++) {
        if (ans.size() == 0 || arr[i] > ans.back()) ans.push_back(arr[i]);
        else {
            auto k = lower_bound(ans.begin(), ans.end(), arr[i]);
            *k = arr[i];
        }
    }
    cout << ans.size();
    return 0;
}//by wqs

算法解析

动态规划法解析

dpi表示以i结尾的最长单调递增子序列的长度,则遍历i之前的dpj,如果arrj < arri,说明arri可以拼接在dpj的后面。

所以dpi = dpj + 1,考虑到有很多j,取最大值,dpi = max(dpi, dpj + 1);

贪心+二分算法解析

考虑到最长单调子序列的单调递增,二分查询很快,所以有了这个算法。

我们尽量让序列越长越好,序列里面的数越小越好,为什么呢

例如

7 1 8 2 9 3 10 5

8 9 10不可以选5

而1 2 3可以选5

前面的数越小,后面的数加进来的概率越大

下面给出过程

7

1,由于7 > 1,不如替换为1,让后面的数容易加入序列

1 8

1 2,由于8 > 2不如替换为2,让后面的数容易加入序列

1 2 9

1 2 3,由于9 > 3,不如替换为3,让后面的数容易加入序列

1 2 3 10

1 2 3 5,由于10 > 5,不如替换为5,让后面的数容易加入序列

每次我们要加入一个数的时候

如果可以直接加入序列末尾,就加入序列末尾,

否则我们二分查找第一个大于或者等于它的位置,将那个位置换成它。

这样操作,后面的数中选率大

相关推荐
lzhdim6 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ9 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛9 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1149 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
新知图书9 小时前
1.3 启动第一个机器人
人工智能·机器人
明志数科10 小时前
自主探索范式下机器人示教数据的工程定位:少量示范为何对质量更敏感
人工智能·机器学习·机器人
w_zero_one11 小时前
算法--模拟
java·数据结构·算法
Javatutouhouduan11 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David11 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
·present·11 小时前
CSAPP(lecture 4_01)
c语言·c++