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

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

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

最长递增子序列是指在一个数列中,找到一个子序列,使得这个子序列是单调递增的,并且这个子序列的长度为所有单调递增子序列中最长的。

C++语言可以很方便地实现最长递增子序列算法。下面是一个使用动态规划方法实现的C++程序。

动态规划方法

动态规划是解决最长递增子序列问题的一种有效算法。该方法使用一个数组来存储当前最长递增子序列的长度,数组的下标表示数列中的元素值,数组的值表示以该元素为结尾的最长递增子序列的长度。

算法的具体步骤如下:

  1. 初始化数组dp[],将所有元素的值都初始化为1。
  2. 遍历数组,对于每一个元素,从头开始寻找比当前元素小的元素,并更新dp[]中对应的值。
  3. 遍历dp[]数组,找到最大值,即为最长递增子序列的长度。
C++程序

下面是一个使用动态规划方法实现的最长递增子序列的C++程序。

#include <iostream>
#include <algorithm>
using namespace std;

int max(int a, int b) {
    return a > b ? a : b;
}

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

int main() {
    int arr[] = {10, 22, 9, 33, 21, 50, 41, 60};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "Length of LIS is " << lis(arr, n) << endl;
    return 0;
}

该程序定义了一个max函数,用于比较两个数的大小。lis函数实现了动态规划算法,其中dp[]数组保存了每一个元素结尾的最长递增子序列的长度。最后,程序输出最长递增子序列的长度。

运行结果

程序输出的结果为:

Length of LIS is 5

即数组{10, 22, 9, 33, 21, 50, 41, 60}的最长递增子序列的长度为5。

总结

最长递增子序列算法是解决一些复杂问题的有效工具。C++语言的动态规划算法实现可以帮助程序员更好地解决这类问题。