博客
关于我
洛谷 P1020 导弹拦截 (LIS)
阅读量:672 次
发布时间: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/

你可能感兴趣的文章
[87]用secureCRT连接虚拟机中的Ubuntu系统,出现“远程主机拒绝连接”错误
查看>>
Shell脚本防DNS攻击检测并删除肉机IP
查看>>
如何在VSCode中定制JSON的IntelliSense
查看>>
椭圆曲线的定义
查看>>
多代理区块链框架客户端的操作
查看>>
RSA操作中的公钥和私钥的生成
查看>>
go语言中类的继承和方法的使用
查看>>
caffe训练的时候遇到的text-format 错误解决方案。
查看>>
Little Zu Chongzhi's Triangles
查看>>
Train Problem II(卡特兰数+大数乘除)
查看>>
一些技术博客
查看>>
第01问:MySQL 一次 insert 刷几次盘?
查看>>
振荡器指标
查看>>
libvirtd:内部错误:Failed to apply firewall rule
查看>>
优先级队列2
查看>>
TiKV 源码解析系列文章(十三)MVCC 数据读取
查看>>
1900分图论 : 1183E1 LCA + Kruskal
查看>>
(建议收藏)计算机网络:传输层概述、UDP协议与可靠传输协议习题解析与拓展
查看>>
Android 开发常用的工具类(更新ing)
查看>>
EasyUI的简单介绍
查看>>