最长递增子序列的实现之一
最长递增子序列 (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(),以及一些辅助