Red Huang

Red Huang

最长公共子序列

计算 LCS 的长度

  1. // 为了实现方便,从数组的第 1 格开始存入序列。

  2. int s1[7+1] = {0, 2, 5, 7, 9, 3, 1, 2};

  3. int s2[5+1] = {0, 3, 5, 3, 2, 8};

  4. // DP 的表格

  5. int array[7+1][5+1];

  6. void LCS()

  7. {

  8. 将 array[x][0] 和 array[0][x] 都设为 0 ;
    
  9. for (int i = 1; i <= s1_length; i++)
    
  10.     for (int j = 1; j <= s2_length; j++)
    
  11.         if (s1[i] == s2[j])
    
  12.             // 这里加上的 1 是指 e1 的长度为 1
    
  13.             array[i][j] = array[i-1][j-1] + 1;
    
  14.         else
    
  15.             array[i][j] = max(array[i-1][j], array[i][j-1]);
    
  16. cout << "LCS 的长度是" << array[seq1_length][seq2_length];
    
  17. }

找出一个 LCS

  1. // 为了实现方便,从数组的第 1 格开始存入序列。

  2. int s1[7+1] = {0, 2, 5, 7, 9, 3, 1, 2};

  3. int s2[5+1] = {0, 3, 5, 3, 2, 8};

  4. // DP 的表格

  5. int array[7+1][5+1];

  6. // 记录这一格的最大值是从哪一格求得的

  7. int prev[7+1][5+1];

  8. void LCS()

  9. {

  10. 将 array[x][0] 和 array[0][x] 都设为 0 ;
    
  11. for (int i = 1; i <= s1_length; i++)
    
  12.     for (int j = 1; j <= s2_length; j++)
    
  13.         if (s1[i] == s2[j])
    
  14.         {
    
  15.             // 这里加上的 1 是指 e1 的长度为 1
    
  16.             array[i][j] = array[i-1][j-1] + 1;
    
  17.             prev[i][j] = 左上方;
    
  18.         }
    
  19.         else
    
  20.         {
    
  21.             if (array[i-1][j] < array[i][j-1])
    
  22.             {
    
  23.                 array[i][j] = array[i][j-1];
    
  24.                 prev[i][j] = 左方;
    
  25.             }
    
  26.             else
    
  27.             {
    
  28.                 array[i][j] = array[i-1][j];
    
  29.                 prev[i][j] = 上方;
    
  30.             }
    
  31.         }
    
  32. cout << "LCS 的长度是" << array[s1_length][s2_length];
    
  33. cout << "LCS 为 ";
    
  34. print_LCS(s1_length, s2_length);
    
  35. }

  36. void print_LCS(int i, int j)

  37. {

  38. // 第一个或第二个 sequence 为空的时候就可停止了
    
  39. if (i==0 || j==0) return;
    
  40. if (prev[i][j] == 左上方)
    
  41. {
    
  42.     print_LCS(i-1, j-1);
    
  43.     cout << s1[i];  // 印出 LCS 的元素
    
  44. }
    
  45. else if (prev[i][j] == 上方)
    
  46.     print_LCS(i-1, j);
    
  47. else if (prev[i][j] == 左方)
    
  48.     print_LCS(i, j-1);
    
  49. }

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。