Найдите общую подпоследовательность наибольшей длины для двух данных последовательностей. [1, с.300].

    Комментарии вы можете посмотреть на шаге 9.

    Приведем текст программы:

Program Problem6_3; 
Uses crt;
Type
   matrix = array [0..20,0..20] of byte;
   str1 = string[20];
Var
    X,Y,L:str1;
    b,c:matrix;
    i,j:byte;
{-- Процедура вычисления длины НОП и "координат" ее получения --}
Procedure LCS_LENGTH(X,Y:str1; var b,c:matrix);
Var i, j: byte;
Begin
  {Обнуление нулевого столбца}
  For i:=1 To length(X) do c[i, 0]:=0;
  {Обнуление нулевой строки}
  For i:=1 To length(Y) do c[0, i]:=0;
  {Заполнение матриц C и B}
  For i:=1 To length(X) do
    For j:=1 To length(Y) do
       If X[i]=Y[j] Then{Если символы совпадают}
                        Begin
                            c[i,j]:= c[i - 1, j - 1] + 1;
                            b[i,j]:= 3;
                        end
                    else
                     If c[i-1, j] >= c[i, j-1] Then
                        Begin{Если элемент сверху больше элемента слева}
                            c[i,j]:= c[i - 1, j];
                            b[i,j]:= 1;
                        end
                    else
                        Begin
                            c[i,j]:= c[i, j - 1];
                            b[i,j]:= 2;
                        end;
end;
{----------- Функция нахождения НОП ---------}
Function PRINT_LGS1(i, j: integer; X: str1; b: matrix):str1;
Var L: str1;
Begin
    L:='';
    While (i<>0) And (j<>0) Do {Пока не элемент (0,0)}
      If b[i, j] = 3 Then {Если попали в эту ячейку по диагонали}
         Begin
           L:= x[i] + L; {Получение последовательности}
           i:= i - 1;
           j:= j - 1;
         end
      else
         {Элементы не входят в обе последовательности}
         If b[i, j] = 1 Then i:= i-1
                        else j:= j-1;
    PRINT_LGS1:= L;
end;
{--------- Код основной программы ---------}
Begin
  clrscr;
  writeln(' Введите первую последовательность 
           (максимальная длина 20 символов):');
  readln(x);{Ввод последовательности}
  writeln(' Введите вторую последовательность 
           (максимальная длина 20 символов):');
  readln(y);{Ввод последовательности}
  clrscr;
  Writeln(' Ваши последовательности:');
  writeln(x);{Вывод последовательностей}
  writeln(y);
  LCS_LENGTH(X, Y, b, c); {Обращение к процедуре}
  writeln;
  L:= PRINT_LGS1(length(x), length(y), X, b); {Вызов функции}
  {Вывод НОП или осообщения о том, что НОП не существует}
  If L = '' Then Writeln('Нет такой последовательности!!!')
            else Writeln('Наибольшая общая последовательность:  ',L);
  ReadKey;
End.
Текст этой программы можно взять здесь.


(1)Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — М.: МЦНМО, 2000.-960с.,263 ил.