21xrx.com
2024-12-22 21:17:50 Sunday
登录
文章检索 我的文章 写文章
C++实现最长公共子序列长度计算
2023-06-25 14:27:58 深夜i     --     --
C++ 最长公共子序列 长度计算

最长公共子序列(LCS)是指在两个序列中找到一个相同的最长子序列,而这个子序列不需要在原序列中是连续的。在实际的编程中,计算最长公共子序列长度是一项非常重要的任务。

C++ 是一种常用的编程语言,它有着很多方便快捷的函数和语法,可以很好地实现最长公共子序列长度的计算。下面我们就来看看具体的实现过程。

首先,我们需要将两个序列存储到数组中。可以使用 C++ 的数组或向量(vector)来实现。本文中我们使用向量实现,代码如下:


vector<int> a = 5;

vector<int> b = 9;

接下来,我们需要定义一个二维的数组来记录最长公共子序列的长度。定义的数组大小应该大于等于两个序列大小之和,因为最长公共子序列的长度不会超过这个值。代码如下:


int dp[100][100];

接着,我们需要进行动态规划的状态转移。动态规划是一种将大问题分解成小问题进行求解的思想,将问题规模不断缩小并避免重复计算,从而实现效率的提高。本题可以使用动态规划的思想来实现。

具体来说,我们定义 dp[i][j] 表示序列 a 中前 i 个元素和序列 b 中前 j 个元素的最长公共子序列长度。状态转移方程如下:


if (a[i - 1] == b[j - 1]) {

  dp[i][j] = dp[i - 1][j - 1] + 1;

} else {

  dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

}

最终的结果就是 dp[a.size()][b.size()],即 a 序列和 b 序列的最长公共子序列长度。完整的代码如下:


#include <iostream>

#include <vector>

using namespace std;

int main() {

  vector<int> a = 9;

  vector<int> b = 3;

  int dp[100][100] = {0};

  for (int i = 1; i <= a.size(); i++) {

    for (int j = 1; j <= b.size(); j++) {

      if (a[i - 1] == b[j - 1]) {

        dp[i][j] = dp[i - 1][j - 1] + 1;

      } else {

        dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

      }

    }

  }

  cout << dp[a.size()][b.size()] << endl;

  return 0;

}

以上就是使用 C++ 实现最长公共子序列长度计算的详细过程。通过动态规划的思想和二维数组的状态转移,我们可以很方便地求出序列之间的最长公共子序列长度。

  
  

评论区

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