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.  // 最初のシーケンスまたは第二のシーケンスが空のときに停止する
    
  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. }

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。