最长递增子序列的实现之一
最长递增子序列 (Longest increasing subsequence,简称LIS) 是指在一个给定序列中,找到一个最长的子序列使得这个子序列中元素的值是递增的。例如序列{ 1,3,2,3,4,8,7,9 }的 LIS 是{ 1,2,3,4,8,9 }。
我们可以使用动态规划算法来解决这个问题。具体方法是创建一个与原序列等长的数组 dp[],用于存储以每个元素作为结尾的最长子序列的长度。初始化 dp 数组中的所有元素为 1,因为每个元素都可以单独形成一个子序列。
接下来,从第二个元素开始,依次遍历整个序列。对于当前遍历到的元素 arr[i],再从第一个元素开始依次比较之前的所有元素 arr[j] (0 <= j < i)。如果 arr[j] 小于 arr[i],那么 arr[i] 可以将 arr[j] 结尾的最长子序列扩展一个元素,得到一个以 arr[i] 结尾的更长的递增子序列。此时,dp[i] 的值就应该更新为 dp[j]+1。
遍历完整个序列后,所有的 dp[i] 值中最大的就是原序列的 LIS 的长度。而这个最大值对应的就是 LIS 的最后一个元素在原序列中的位置。
下面是该算法的 C++ 实现,包括函数 findLIS() 和主函数 main(),以及一些辅助函数。其中,使用了 STL 中的 vector 容器来存储 LIS 序列,最后输出结果时进行了倒序输出,让结果符合正常的递增顺序。
#include <iostream>
#include <vector>
using namespace std;
void prin
本文介绍了如何使用动态规划算法解决最长递增子序列问题,详细解释了算法思路并提供了C++实现。通过遍历序列和维护一个dp数组,可以找到序列中的最长递增子序列。算法时间复杂度为O(n^2),但可以通过优化达到O(nlogn)。
订阅专栏 解锁全文
1639

被折叠的 条评论
为什么被折叠?



