📜  最长递增子序列的C++程序(1)

📅  最后修改于: 2023-12-03 14:55:23.514000             🧑  作者: Mango

最长递增子序列的C++程序

最长递增子序列(Longest Increasing Subsequence, LIS)是一种经典的算法问题,在计算机科学领域被广泛应用。在给定序列中,LIS是指找到最长的子序列,该子序列的元素按照递增的顺序排列。

下面是一个使用动态规划解决最长递增子序列问题的C++程序:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int longestIncreasingSubsequence(vector<int>& nums) {
    int n = nums.size();
    vector<int> dp(n, 1);  // dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (nums[j] < nums[i]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
    }

    int maxLength = 1;
    for (int i = 0; i < n; i++) {
        maxLength = max(maxLength, dp[i]);
    }

    return maxLength;
}

int main() {
    vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18};
    int length = longestIncreasingSubsequence(nums);

    cout << "最长递增子序列的长度为: " << length << endl;

    return 0;
}
程序说明

这个程序使用动态规划的方法解决最长递增子序列问题。首先,我们定义一个长度为n的一维数组dp,其中dp[i]表示以nums[i]结尾的最长递增子序列的长度。初始化时,将dp数组的所有元素设置为1,因为每个元素本身都是一个递增子序列。

然后,我们利用两层循环遍历整个输入数组nums。外层循环用来遍历每个元素,内层循环用来查找在当前元素之前比它小的元素,并更新dp数组中的值。如果找到了比nums[i]小的元素nums[j],则说明可以将nums[i]添加到以nums[j]结尾的最长递增子序列中,此时更新dp[i]dp[j] + 1

最后,我们遍历整个dp数组,找到其中的最大值,即为最长递增子序列的长度。

在示例中,给定序列为[10, 9, 2, 5, 3, 7, 101, 18],最长递增子序列为[2, 3, 7, 18],其长度为4。程序输出结果为最长递增子序列的长度为: 4

以上就是一个使用动态规划解决最长递增子序列问题的C++程序。

请注意,此程序未处理输入序列为空的情况,如果输入为空,可能会导致数组越界的问题,需要根据具体情况进行异常处理。