Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/56: Рейтинг темы: голосов - 56, средняя оценка - 4.88
1 / 1 / 3
Регистрация: 04.11.2010
Сообщений: 85

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

12.01.2011, 08:25. Показов 10540. Ответов 17

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

Найти самую длинную восходящую подпоследовательность в данной последовательности
Помогите пожалуйста. Необходимо найти самую длинную восходящую подпоследовательность в данной последовательности. Например, в...

Как найти самую длинную возрастающую последовательность?
На вход подаются целые числа,кроме 0. Если ввели 0, значит ввод закончился. Общее число чисел - неизвестно (пока не появится 0). Найти...

Найти в последовательности самую длинную подпоследовательность, состоящую только из положительных чисел
Найти в заданной последовательности самую длинную подпоследовательность, состоящую только из положительных чисел. Используя input and...

17
 Аватар для use
180 / 180 / 81
Регистрация: 18.12.2010
Сообщений: 346
12.01.2011, 12:40
Цитата Сообщение от Gisele Посмотреть сообщение
Моя программа генерирует все множества из n количества элементов
А зачем?.. О_о

Пока я читал условие, все было ясно. Когда прочитал это - .. мм.. не знаю, что и сказать )).

Смотри, вот условие:
Цитата Сообщение от Gisele Посмотреть сообщение
Дана последовательность n целых чисел. Найдите самую длинную возрастающую подпоследовательность
Ты знаешь, что такое последовательность?
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
12.01.2011, 13:23
Gisele, При чем здесь комбинаторика и генерация? Просто заданная последовательность, например массив вида
1 2 3 0 4 8 9 12 5
наибольшая по длине возрастающая подпоследовательность
0 4 8 9 12
0
1 / 1 / 3
Регистрация: 04.11.2010
Сообщений: 85
12.01.2011, 14:59  [ТС]
use, я хотела найти все подмножества и проверить каждое

Puporev, как это сделать правильно?
0
 Аватар для use
180 / 180 / 81
Регистрация: 18.12.2010
Сообщений: 346
12.01.2011, 15:12
Цитата Сообщение от Gisele Посмотреть сообщение
как это сделать правильно?
Ты все путаешь.
Тут у тебя УПОРЯДОЧЕННОЕ множество. Последовательность - это просто функция целого аргумента (номера члена). Она должна быть изначально тебе дана - в файле, например. Или, для отладочных целей, можно сгенерировать случайным образом. Потом ты просто идешь по ней - с первого элемента и до последнего - и отслеживаешь изменения направления тренда - вверх или вниз..
Pascal
1
2
3
4
5
6
7
8
9
10
l:=1;    // инициализация, минимально возможная длина последовательности
lmax:=1;         // минимально возможная максимальная длина
for i:=2 to n do
  if a[i-1]<=a[i] then Inc(l)  // если возрастание, то увеличиваем l
  else begin                  // если убывание ..
    if l>lmax then lmax:=l;   // .. то проверяем, не превышен ли старый рекорд, и обновляем его
    l:=0            // обнуляем длину (для подсчета новых подпоследовательностей)
  end
end;
if l>lmax then lmax:=l;    // в самом конце - еще одна проверка, иначе последняя посл. выпадет из рассмотрения
Вот, как-то так.. Сможешь?
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
12.01.2011, 16:00
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Если нужно найти и вывести на экран.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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.
2
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 7
04.12.2014, 12:50
честно говоря я здесь не нашёл своё задание вот моё задание:-сформулировать вещественный массив А1(45), элементами которого являются случайные числа . Найти саммую длинную последовательность чисел ,упорядоченную по возрастанию. Вывести на экран исходный массив и найденную последовательность . Вот как то так
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
04.12.2014, 13:06
Здесь тоже самое только числа целые и ввод с клавы, так что не прибедняйтесь, а чуть поправляйте мой код, писать еще раз нет никакого желания.
0
10 / 10 / 1
Регистрация: 28.11.2013
Сообщений: 153
08.05.2015, 22:37
use, мне кажется, что Ваше понимание подпоследовательности несколько отлично от классического.
Скорее всего, ТС искал это:
0
5 / 5 / 7
Регистрация: 02.03.2016
Сообщений: 46
10.10.2016, 20:43
Где-то в ней кроется ошибка. При тесте 1 2 3 7 4 6 5 5 6 4 7 3 8 2 9 1 программа выдаст 7 3 2 1, а не 1 2 3 4 5 6 7 8 9
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
10.10.2016, 20:53
Во первых не 7 3 2 1, а 1 2 3 7,
а во вторых нет такой последовательности
1 2 3 4 5 6 7 8 9 это просто выборка чисел из массива, нужно
Найти самую длинную возрастающую подпоследовательность.
Т.е. непрерывный участок массива, где числа идут строго по возрастанию.
0
5 / 5 / 7
Регистрация: 02.03.2016
Сообщений: 46
10.10.2016, 21:11
Если я правильно понимаю условие задачи, то мы берем массив за множество чисел, и подпоследовательностью является любое подмножество. И из них нужно выбрать наибольшее.

Просто столкнулся с ситуацией, когда мое НВП не работает и стал искать другое. Так как я паскалист, мне не помог e-maxx

Добавлено через 1 минуту
Вернее сказать столкнулся с проблемой восстановления ответа
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
10.10.2016, 21:12
Chost,
максимальная непрерывная возрастающая подпоследовательность для приведенного теста: 1 2 3 7, ровно та, что находит программа.
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
10.10.2016, 21:13
В данной задаче подпоследовательность = последовательность полученная путем вычеркивания некоторых чисел. Вот возьмем например последовательность
1 2 3 4 5 6 7
Здесь например подпоследовательности 1 3 4, 1 2 4 7, 2 4 6 7, ну я думаю понятно. И всего их если не ошибаюсь 2n.
0
5 / 5 / 7
Регистрация: 02.03.2016
Сообщений: 46
10.10.2016, 21:14
Цитата Сообщение от bormant Посмотреть сообщение
максимальная непрерывная возрастающая подпоследовательность
Спорить, конечно не стану, но автор написал:"Дана последовательность n целых чисел. Найдите самую длинную возрастающую подпоследовательность." Никакого намека не непрерывность
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
10.10.2016, 21:16
Chost, Придумал себе задачу, решай ее и нефиг флудить и некропостить.
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
10.10.2016, 21:20
Цитата Сообщение от Puporev Посмотреть сообщение
Придумал себе задачу
Ничего он не придумал. Это известная задача. "Наибольшая возрастающая подпоследовательность" в гугле если набрать легко находится.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
11.10.2016, 08:50
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Chost,
Например, можно так за O(n*log(n)):
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
type
  PIntArr = ^TIntArr;
  TIntArr = array [0..$FFFE div SizeOf(Integer)-1] of Integer;
 
procedure LongestIncSubseq(
  na: Integer; const  a: array of Integer; 
  var nb: Integer; var b: array of Integer);
var
  prv, lst: PIntArr;
  i, l, r, m: Integer;
begin;
  GetMem(prv,na*SizeOf(Integer));
  GetMem(lst,na*SizeOf(Integer));
  nb:=-1;
  for i:=0 to na-1 do begin;
    l:=0; r:=nb;
    while l<=r do begin
      m:=l+(r-l) div 2;
      if a[i]<=a[lst^[m]] then r:=m-1 else l:=m+1;
    end;
    if r>=0 then r:=lst^[r];
    prv^[i]:=r; lst^[l]:=i;
    if nb<l then nb:=l;
  end;
  m:=lst^[nb]; Inc(nb);
  for i:=nb-1 downto 0 do begin
    b[i]:=m; m:=prv^[m];
  end;
  FreeMem(lst,na*SizeOf(Integer));
  FreeMem(prv,na*SizeOf(Integer));
end;
 
const
  na=16;
  a: array [0..na-1] of Integer = (1,2,3,7,4,6,5,5,6,4,7,3,8,2,9,1);
var
  b: array [0..na-1] of Integer;
  i, nb: Integer;
begin
  LongestIncSubseq(na,a,nb,b);
  for i:=0 to nb-1 do Write(' ',a[b[i]]); WriteLn;
end.
Добавлено через 9 часов 23 минуты
Если нужно сразу возвращать элементы, а не их позиции, то правка очевидна:
Pascal
27
  b[i]:=a[m]; ...
Pascal
41
... Write(' ',b[i]); ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2016, 08:50
Помогаю со студенческими работами здесь

Найдите самую длинную строку в файле
здравствуйте программисты. нужна помощь в написании программы по теме текстовые файлы. просмотрите мой вариант программы, я думаю что...

Текстовый файл. Отыскать самую длинную и самую короткую строку
Пожалуйста, программа в Паскаль с текстовыми файлами. (для меня сложная) Вот задание... Создать текстовый файл с несколькими строками....

Поменять местами самую короткую и самую длинную строки текста (при условии, что они единственны)
Дан текстовый файл f. Поменять местами самую короткую и самую длинную строки текста (при условии, что они единственны), результат занести в...

программа, которая считывает цепочку чисел и печатает наиболее длинную, монотонно возрастающую их подпоследовательность
Добрый день!Помогите решить задачку. Составить программу: программа, которая считывает цепочку чисел и печатает наиболее...

Найти в последовательности самую длинную подпоследовательность, состоящую только из положительных чисел
Найти в заданной последовательности самую длинную подпоследовательность, состоящую только из положительных чисел. используя текстовые файлы


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru