Найдите самую длинную возрастающую подпоследовательность. - Turbo Pascal
Формулировка задачи:
Дана последовательность n целых чисел. Найдите самую длинную возрастающую подпоследовательность.
Моя программа генерирует все множества из n количества элементов. Не могу найти самую длиннную возраст подпоследовательность. Помогите пожалуиста
Решение задачи: «Найдите самую длинную возрастающую подпоследовательность.»
textual
Листинг программы
uses crt;
const nmax=100;
var a:array[1..nmax] of integer;
i,j,n,k,p1,max:byte;
begin
clrscr;
repeat
write('Размер массива от 2 до ',nmax,' n=');
readln (n);
until n in [2..nmax];
writeln('Введите ',n,' элементов массива:');
for i:=1 to n do
readln (a[i]);
clrscr;
writeln('Массив:');
for i:=1 to n do
write(a[i],' ');
writeln;
writeln;
{Поиск позиции и длины максимальной цепи}
max:=0;{Первоначальные значения}
i:=2;p1:=0;
while i<=n do
if a[i]>a[i-1] then
begin
k:=1;j:=i;
while (a[j]>a[j-1])and(j<=n) do
begin
inc(j);
inc (k); {Если возрастает - наращиваем счётчик}
end;
if k>max then
begin
max:=k;
p1:=i-1;
end;
i:=i+k;{перепрыгиваем}
end
else inc(i);
writeln; {Выводим результат}
if max=0 then write('Участков возрастания нет!')
else
begin
writeln('Максимальная длина=',max);
for i:=p1 to p1+max-1 do
write (a[i],' ');
end;
readln
end.
Объяснение кода листинга программы
- Создается переменная
nmaxи присваивается ей значение 100. - Создается массив
aтипаarray[1..nmax] of integer. - Создаются переменные
i,j,n,k,p1иmaxи присваиваются им начальные значения. - Выводится сообщение с предложением ввести размер массива от 2 до
nmaxи сам размер массива. - Считывается размер массива
n. - Считываются
nэлементов массива. - Выводится сообщение с предложением ввести
nэлементов массива. - Запускается цикл
while i<=n do, который будет выполняться, покаiменьше или равноn. - Внутри цикла проверяется условие
if a[i]>a[i-1] then. Если это условие истинно, то начинаются вложенные циклыwhile (a[j]>a[j-1])and(j<=n)иif k>max then, которые будут выполняться, покаa[j]большеa[j-1]иkбольшеmax. - Если условие из пункта 9 истинно, то увеличивается значение
jиkна единицу, а также обновляется значениеmax, еслиkбольшеmax. - После окончания вложенных циклов внутреннего цикла, значение
iувеличивается наk. - Если внутренний цикл не выполнялся, то значение
iувеличивается на единицу. - Выводится сообщение с предложением вывести результат.
- Если
maxравно нулю, выводится сообщение о том, что участков возрастания нет. - В противном случае выводится сообщение с максимальной длиной возрастающей подпоследовательности.
- Для
iотp1доp1+max-1выводится элемент массиваa[i]. - Выводится символ новой строки.
- Программа завершается.