给定一个整数序列,求其中最长的递增子序列的长度是多少?
给定一个由字母组成的字符串,求其中最长的递增子序列的长度是多少?
给定一个浮点数序列,求其中最长的递增子序列的和是多少?
给定一个二维整数矩阵,求其中最长的递增子序列的和是多少?
给定一个由整数构成的有向图,求其中最长的递增子序列的长度是多少?
Longest Increasing Subsequence(最长上升子序列)是指在一个序列中找到一个子序列,使得该子序列中的元素依次递增,且该子序列的长度最长。例如,序列 [3, 5, 2, 7, 1, 4, 8] 的最长上升子序列为 [3, 5, 7, 8]。
求最长上升子序列的常见方法是使用动态规划,以下为一个简单的动态规划算法:
例如,对于序列 [3, 5, 2, 7, 1, 4, 8],可以使用上述算法求解最长上升子序列。具体步骤如下:
定义:Longest Increasing Subsequence(LIS)指数列中最长的递增子序列。例如,对于数列{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5},其LIS为{1, 2, 5, 6, 9},长度为5。
LIS的求解方法:常用的求解LIS的方法有暴力搜索、动态规划、贪心、二分查找等。
动态规划法:将LIS的求解问题分解成子问题,使用动态规划求解,时间复杂度为O(n^2)。
贪心法:通过选择适当的元素构造LIS,时间复杂度为O(nlogn)。
二分查找法:通过维护一个升序序列,并不断更新,来求解LIS,时间复杂度为O(nlogn)。
应用:LIS问题广泛应用于各种实际问题中,如最长上升子序列、最长下降子序列、最长不下降子序列等。
LeetCode 300 - Longest Increasing Subsequence
给定一个未排序的整数数组,找到最长递增子序列的长度。
例如:
Input:[10,9,2,5,3,7,101,18]
Output:4
Explanation:
最长的递增子序列是 [2,3,7,101],因此长度为 4。
GeeksforGeeks - Longest Increasing Subsequence
给定一个整数数列,找到其中的最长递增子序列。
例如:
Input:[3, 10, 2, 1, 20]
Output:3
Explanation:
最长的递增子序列是 [3, 10, 20],因此长度为 3。
SPOJ - Increasing Subsequences
给定一个整数数列,找出有多少个子序列是递增的。
例如:
Input:[5,2,8,6,3,6,9,7]
Output:8
Explanation:
递增子序列分别为 [5], [2], [8], [6], [3], [6], [9], [7]。
CodeChef - LISAND - Longest Increasing Subsequence and Non-decreasing Array
给定一个整数数列,找到其中的最长递增子序列的长度,同时也需要找到能够使数列变成非递减的最少操作次数。
例如:
Input:[2, 2, 2, 1, 1, 1, 3, 3, 3]
Output:2 3
Explanation:
最长的递增子序列是 [2, 3],长度为 2。最少需要执行 3 次操作才能使数列变成非递减的:将第 4, 5, 6 个数变成 2。
Hackerrank - The Longest Increasing Subsequence of an Array
给定一个整数数列,找到其中的最长递增子序列,同时需要找到所有符合该要求的最长子序列中,字典序最小的那个。
例如:
Input:[0, 8, 4, 12, 2, 10, 6, 14, 1, 9]
Output:[0, 4, 6, 9, 14]
Explanation:
最长的递增子序列是 [0, 2, 6, 9, 14] 和 [0, 4, 6, 9, 14],但是前者字典序比后者大,因此输出后者。