单调递增子序列(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:4
给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。
如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
数据以EOF结束 。
输入数据保证合法(全为int型整数)!
7 1 9 10 5 11 2 13 2 2 -1
5 1
思路:
最长上升子序列。
同样需要用 n log n 的写法来优化,除此之外,不能初始化第一个数为 -1,因为序列中的数有可能出现负数,所以直接将第一个数放进去考虑,最后长度输出 len + 1 即可(因为下标是从 0 开始的)。
AC:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int num[100005]; int main() { int n; while (~scanf("%d", &n)) { int len = 0; scanf("%d", &num[len]); --n; while (n--) { int ans; scanf("%d", &ans); if (ans > num[len]) num[++len] = ans; else *lower_bound(num, num + len, ans) = ans; } printf("%d\n", len + 1); } return 0; }
相关推荐
在算法领域,最长上升子序列(Longest Increasing Subsequence,简称LIS)是一个经典问题,它涉及到找出一个给定序列中严格单调递增的子序列,并返回这个子序列的最大长度。LIS问题不仅是计算机科学中的一个基础问题...
该问题的目标是从一个无序的数字序列中找出最长的子序列,其中子序列的元素在原序列中是连续的,并且是单调递增的。 最长上升子序列问题在动态规划(Dynamic Programming,简称DP)领域内占有重要位置。解决这个...
该问题的目标是在一个无序的整数序列中找出一个最长的上升子序列,即子序列中的数字是单调递增的。以下是几种常见的求解方法。 首先,传统的动态规划法是解决这一问题的基础方法。动态规划的思想是通过构建一个一维...
最后,我们要设计一个 O(n^2) 时间复杂度的算法来找出一个序列中最长的单调递增子序列。这个问题可以通过暴力枚举所有可能的子序列来解决,但效率较低。更优的解决方案是使用动态规划,定义一个数组 `max[]` 来存储...
本课件主要涵盖了三个经典的算法问题:寻找数组中的最大值和次大值、计算数列的最大子段和以及找出序列中最长单调递增子序列。 1. **寻找数组中的最大值和次大值** - **算法思路**:这个算法采用递归策略。当数组...
- 递推公式可以表示为:dp[i]表示以a[i]结尾的最长单调递增子序列的长度。对于每个元素,更新dp数组,考虑它是否能延长之前已知的单调递增子序列。 - 时间复杂度为O(n^2),因为每个元素都需要遍历一次dp数组来更新...
- 改进版动态规划:使用动态规划结合二分查找的方法,维护一个单调递增的序列,该序列的每个元素代表了长度为 `i` 的最长不下降子序列的最小结尾值。通过二分查找确定更新的位置,可以将时间复杂度降低到 `O(nlogn)`...
**题目描述**:设计一个`O(n^2)`时间的算法,找出由`n`个数组成的序列中最长单调递增子序列。 **解析**:此问题可以通过动态规划算法解决。定义状态`f[i]`表示以第`i`个元素结尾的最长递增子序列的长度。状态转移...
最长上升子序列 O(nlogn) - **问题描述**:给定一个序列,求其最长上升子序列的长度。 - **算法思路**:使用二分查找优化动态规划过程,时间复杂度降为 O(n log n)。 - **核心步骤**: 1. 维护一个数组 dp,dp[i] ...