博客
关于我
洛谷 P1020 导弹拦截 (LIS)
阅读量:674 次
发布时间:2019-03-17

本文共 1871 字,大约阅读时间需要 6 分钟。

最长不上升子序列和最长上升子序列是数据处理和算法研究中的经典问题。对于这两个问题,我们可以使用特定的算法来高效解决。

最长不上升子序列的解决方案

不上升子序列(Non-Increasing Subsequence)的目标是找到一个最长的序列,使得序列中的每一个元素都不小于前一个元素。

方法思路

我们可以通过维护一个数组 f 来记录最长不上升子序列的长度。初始化时,f[1] 以第一个元素的负值开始。对于每一个后续元素 a[i],我们检查是否它小于等于当前长度的最小值。如果是,我们添加它到数组的末尾;如果不是,我们找到它应该插入的位置,然后更新数组中的值。

这个算法的时间复杂度是 O(n log n),主要是由于 upper_bound 函数的使用,用于快速查找插入位置。

#include 
#include
#include
using namespace std;int main() { vector
a; int n; while(~scanf("%d", &a.push_back(n++))) { n--; vector
f; f.push_back(-a[0]); for (int i = 1; i < n; ++i) { if (f.back() <= -a[i]) { f.push_back(-a[i]); } else { auto it = upper_bound(f.begin() + 1, f.end(), -a[i]); f[it - f.begin()] = -a[i]; } } cout << f.size() << endl; f.clear(); } return 0;}

最长上升子序列的解决方案

上升子序列(Ascending Subsequence)的目标是找到一个最长的序列,使得序列中的每一个元素都大于前一个元素。

方法思路

类似最长不上升子序列的问题,我们可以使用类似的方法来解决上升子序列问题。我们维护一个数组 f,记录最长上升子序列的长度。初始化时,f[1] 以第一个元素开始。对于每一个后续元素 a[i],如果它大于当前长度的最大值,我们将其添加到数组的末尾;否则,我们找到它应该插入的位置,更新数组中的值。

该算法的时间复杂度同样是 O(n log n),主要是由于 lower_bound 函数的使用,用于快速查找插入位置。

#include 
#include
#include
using namespace std;int main() { vector
a; int n; while(~scanf("%d", &a.push_back(n++))) { n--; vector
f; f.push_back(a[0]); for (int i = 1; i < n; ++i) { if (f.back() < a[i]) { f.push_back(a[i]); } else { auto it = lower_bound(f.begin() + 1, f.end(), a[i]); f[it - f.begin()] = a[i]; } } cout << f.size() << endl; f.clear(); } return 0;}

这两个算法都基于二分查找的思想,通过在数组中查找合适的位置来高效地更新最长子序列的长度,避免了暴力枚举的高时间复杂度。

转载地址:http://vdyhz.baihongyu.com/

你可能感兴趣的文章
HTTP 错误 500.21 - Internal Server Error 发布网站遇到这个错误
查看>>
初次安装webpack之后,提示安装webpack-cli
查看>>
使用FileZilla,FTP登录出现错误:FileZilla状态: 不安全的服务器,不支持 FTP over TLS
查看>>
Hbase压力测试
查看>>
StreamReader & StreamWriter
查看>>
C#中的类、方法和属性
查看>>
Python爬虫训练:爬取酷燃网视频数据
查看>>
Python数据分析入门(十九):绘制散点图
查看>>
C++版浙大PAT乙级1069(20分)测试点3答案错误解决方法
查看>>
Callable中call方法和Runnable中run方法的区别
查看>>
Linux yum提示Loaded plugins错误的解决方法
查看>>
Netty的体系结构及使用
查看>>
xshell解决文本粘贴格式错误
查看>>
什么是证券型代币?
查看>>
Android中获取并设置屏幕亮度
查看>>
Swift中使用DispatchGroup分组管理异步任务
查看>>
MVVM_Template
查看>>
网络+图片加载框架(英文版)
查看>>
Python imageio方法示例
查看>>
Possible missing firmware
查看>>