21xrx.com
2024-12-22 21:15:56 Sunday
登录
文章检索 我的文章 写文章
C++求解最长上升子序列长度
2023-07-10 03:11:33 深夜i     --     --
C++ 最长上升子序列 求解 长度

最长上升子序列(Longest Increasing Subsequence,LIS)是一种经典的算法问题,其常见的求解方法有动态规划、贪心算法、二分查找等。其中,动态规划是比较常用的一种方法。

下面以C++语言为例,介绍如何使用动态规划算法求解最长上升子序列的长度。

动态规划算法的基本思路是:先确定状态,再确定状态转移方程,最后根据状态转移方程进行动态规划求解。

1. 确定状态

将原序列设为a1, a2, ……,an,状态f(i)表示以ai为末尾的最长上升子序列的长度。

2. 确定状态转移方程

依次枚举每一个位置i,对于每个位置i,枚举其前面所有小于它的位置j,如果能从j转移过来,则f(i)=max{f(j)+1}。

3. 初始状态

初始状态为f(i)=1(i=1,2,…,n),因为每个位置上都可以是由自己本身组成的长度为1的上升子序列。

4. 求解时间复杂度

使用动态规划算法求解最长上升子序列的长度,时间复杂度为O(n^2)。

下面是使用C++语言实现该算法的代码:


int lis(int a[], int n) {

  int f[n];

  memset(f, 0, sizeof(f)); //初始化为0

  int res = 0; //最长上升子序列长度

  for(int i = 0; i < n; ++i) {

    f[i] = 1; //初始状态都为1

    for(int j = 0; j < i; ++j) {

      if(a[j] < a[i]) {

        f[i] = max(f[i], f[j]+1); //状态转移方程

      }

    }

    res = max(res, f[i]); //更新最长上升子序列长度

  }

  return res;

}

上述代码中,lis函数的输入参数为原序列a和序列长度n,其返回值为最长上升子序列的长度res。该函数使用动态规划算法,首先对状态数组f进行初始化,然后依次枚举原序列中的每个位置i和其前面所有小于它的位置j,并根据状态转移方程f(i)=max{f(j)+1},更新f(i)的值。最后,将f(i)的最大值作为最长上升子序列长度res输出即可。

总之,使用动态规划算法求解最长上升子序列的长度是比较容易理解和实现的,只需要确定状态、状态转移方程和初始状态即可。但其时间复杂度较高,不适用于较大的数据集。因此,在实际应用中,需要根据具体情况选择合适的算法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复