Найдите самую длинную возрастающую подпоследовательность. - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Дана последовательность n целых чисел. Найдите самую длинную возрастающую подпоследовательность.
Листинг программы
  1. uses crt;
  2. type vector=array[1..100] of integer;
  3. var k,n,i,j,q,t:integer;
  4. a,b,p:vector;
  5. procedure cnk(m,l:integer);
  6. var i:integer;
  7. begin
  8. writeln;
  9. if m=0 then begin
  10. for j:=1 to k do
  11. write(p[j],' ');
  12. end
  13. else
  14. for i:=l to n-m+1 do
  15. begin
  16. p[k-m+1]:=a[i];
  17. cnk(m-1,i+1)
  18. end;
  19. end;
  20. begin
  21. writeln ('Подмножества из N по K');
  22. writeln ('Введите N,K:');
  23. read(n);
  24. for i:=1 to n do
  25. begin
  26. a[i]:=random(10);
  27. write(a[i],' ');
  28. end;
  29. k:=1;
  30. repeat
  31. k:=k+1;
  32. writeln;
  33. for j:=1 to k do
  34. for t:=2 to k do
  35. if p[j]<=p[j+1] then
  36. begin
  37. inc(q);
  38. for j:=1 to q do
  39. b[j]:=p[j];
  40. end;
  41. cnk(k,1);
  42. until(k>n);
  43.  
  44. end.
Моя программа генерирует все множества из n количества элементов. Не могу найти самую длиннную возраст подпоследовательность. Помогите пожалуиста

Решение задачи: «Найдите самую длинную возрастающую подпоследовательность.»

textual
Листинг программы
  1. uses crt;
  2. const nmax=100;
  3. var a:array[1..nmax] of integer;
  4.       i,j,n,k,p1,max:byte;
  5. begin
  6. clrscr;
  7. repeat
  8. write('Размер массива от 2 до ',nmax,' n=');
  9. readln (n);
  10. until n in [2..nmax];
  11. writeln('Введите ',n,' элементов массива:');
  12. for i:=1 to n do
  13. readln (a[i]);
  14. clrscr;
  15. writeln('Массив:');
  16. for i:=1 to n do
  17. write(a[i],' ');
  18. writeln;
  19. writeln;
  20. {Поиск позиции и длины максимальной цепи}
  21. max:=0;{Первоначальные значения}
  22. i:=2;p1:=0;
  23. while i<=n do
  24. if a[i]>a[i-1] then
  25.   begin
  26.    k:=1;j:=i;
  27.    while (a[j]>a[j-1])and(j<=n) do
  28.     begin
  29.      inc(j);
  30.      inc (k); {Если возрастает - наращиваем счётчик}
  31.     end;
  32.    if k>max then
  33.     begin
  34.      max:=k;
  35.      p1:=i-1;
  36.     end;
  37.    i:=i+k;{перепрыгиваем}
  38.   end
  39. else inc(i);
  40. writeln; {Выводим результат}
  41. if max=0 then write('Участков возрастания нет!')
  42. else
  43.  begin
  44.   writeln('Максимальная длина=',max);
  45.   for i:=p1 to p1+max-1 do
  46.   write (a[i],' ');
  47.  end;
  48. readln
  49. end.

Объяснение кода листинга программы

  1. Создается переменная nmax и присваивается ей значение 100.
  2. Создается массив a типа array[1..nmax] of integer.
  3. Создаются переменные i, j, n, k, p1 и max и присваиваются им начальные значения.
  4. Выводится сообщение с предложением ввести размер массива от 2 до nmax и сам размер массива.
  5. Считывается размер массива n.
  6. Считываются n элементов массива.
  7. Выводится сообщение с предложением ввести n элементов массива.
  8. Запускается цикл while i<=n do, который будет выполняться, пока i меньше или равно n.
  9. Внутри цикла проверяется условие 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.
  10. Если условие из пункта 9 истинно, то увеличивается значение j и k на единицу, а также обновляется значение max, если k больше max.
  11. После окончания вложенных циклов внутреннего цикла, значение i увеличивается на k.
  12. Если внутренний цикл не выполнялся, то значение i увеличивается на единицу.
  13. Выводится сообщение с предложением вывести результат.
  14. Если max равно нулю, выводится сообщение о том, что участков возрастания нет.
  15. В противном случае выводится сообщение с максимальной длиной возрастающей подпоследовательности.
  16. Для i от p1 до p1+max-1 выводится элемент массива a[i].
  17. Выводится символ новой строки.
  18. Программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.643 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы