跳到主要內容

Longest Common Subsequence

計算 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. }

留言