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

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

最长单调递增子序列

问题描述

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

示例输入

9
2 1 5 3 6 4 8 9 7

示例输出

5

示例输入

6
5 6 7 1 2 8

示例输出

4

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

#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))

#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

算法解析

动态规划法解析

dp[i]表示以i结尾的最长单调递增子序列的长度,则遍历i之前的dp[j],如果arr[j] < arr[i],说明arr[i]可以拼接在dp[j]的后面。

所以dp[i] = dp[j] + 1,考虑到有很多j,取最大值,dp[i] = max(dp[i], dp[j] + 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,让后面的数容易加入序列

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

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

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

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

http://www.xdnf.cn/news/3143.html

相关文章:

  • Stable Diffusion基础配置
  • 使用 v-print 实现 Vue 项目中的打印功能
  • rust 全栈应用框架dioxus
  • 深入解析常见排序算法及其 C# 实现
  • 系统思考培训助力总经理
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月29日第67弹
  • RISE with SAP 的合同及许可解析
  • 【电子对抗训练革命】新一代便携式雷达模拟器技术解密
  • Spring事务开发经验 回滚和不回滚?
  • ADS1299模拟前端(AFE)代替芯片——LHE7909
  • C事件驱动网络库​​libevent的http详解
  • Java实现使用EasyExcel按模板导出文件
  • 【Unity】使用LitJson保存和读取数据的例子
  • SQL注入
  • Leetcode 3533. Concatenated Divisibility
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十七章 IO流:超越FILE*的维度战争
  • SpringBoot之SpringAl实现AI应用-快速搭建
  • LeetCode -160.相交链表
  • “假读“操作在I2C接收流程中的原因
  • DECAP CELL
  • Qt入门——什么是Qt?
  • 【Linux】第十三章 访问Linux文件系统
  • React:封装一个编辑文章的组件
  • python如何流模式输出
  • Missashe考研日记-day30
  • JR6001语音模块详解(STM32)
  • 1.3 点云数据获取方式——ToF相机
  • Linux电源管理(3)_关机和重启的过程
  • 【今日三题】小红的ABC(找规律) / 不相邻取数(多状态dp) / 空调遥控(排序+二分/滑动窗口)
  • 面向人工智能、量子科技、人形机器人等产业,山东启动制造业创新中心培育认定