Задача на динамическое программирование

Ответить
Римма
Сообщения: 9
Зарегистрирован: 02 апр 2009, 19:39
Контактная информация:

02 апр 2009, 19:53

Разработать алгоритм, находящий наибольшую возрастающую подпоследовательность данной последовательности из n чисел. Допускается, чтобы алгоритм работал за время порядка n^2 (но желательно за n*logn).

Большое спасибо!!!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

03 апр 2009, 01:16

Код: Выделить всё

const
  n=25;
  m=(n+1) div 2;
  seq:array[1..n] of integer = (
    3,5,2,1,3,23,4,34,34,54,4,54,56,46,3,6,3456,345,63,456,4,56,45,4,6
  );
  
var
  i,maxlen,seqi:integer;
  pos:array[1..m] of integer;
  len:array[1..m] of integer;
begin
  for i:=1 to m do begin pos[i]:=-1; len[i]:=1; end;
  seqi:=1;
  
  for i:=1 to pred(25) do begin
    if seq[i]<seq[succ(i)] then begin
      if pos[seqi]=-1 then pos[seqi]:=i;
      inc(len[seqi]);
    end else begin
      if pos[seqi]>=0 then inc(seqi);
    end
  end;
  maxlen:=1;
  for i:=2 to seqi do if len[i]>len[maxlen] then maxlen:=i;
  
  writeln('самая длинная последовательность начинается с позиции ',
    pos[maxlen],' и имеет длину ', len[maxlen])
end.
Римма
Сообщения: 9
Зарегистрирован: 02 апр 2009, 19:39
Контактная информация:

03 апр 2009, 22:32

спасибо. но только вы не правильно меня поняли((
из последовательности например 1 3 17 4 19 30 2 90
должен быть ответ 1 3 17 19 30 90, т.к. там не сказано чтобы была последовательность по порядку :(
и за какое время она проходит: n^2 или n*logn?
Esgal
Сообщения: 78
Зарегистрирован: 04 ноя 2008, 01:15

03 апр 2009, 23:21

вы уверенны в том что вас неправильно поняли?
Luke! Use the Force! Use the Force... oh, Luke! Stop using the Force, use your head!
Римма
Сообщения: 9
Зарегистрирован: 02 апр 2009, 19:39
Контактная информация:

04 апр 2009, 09:57

да, уверена. я у преподавателя спрашивала :)
Z-Creed
Сообщения: 2
Зарегистрирован: 23 дек 2013, 18:05

23 дек 2013, 18:09

Naeel Maqsudov писал(а):

Код: Выделить всё

const
  n=25;
  m=(n+1) div 2;
  seq:array[1..n] of integer = (
    3,5,2,1,3,23,4,34,34,54,4,54,56,46,3,6,3456,345,63,456,4,56,45,4,6
  );
  
var
  i,maxlen,seqi:integer;
  pos:array[1..m] of integer;
  len:array[1..m] of integer;
begin
  for i:=1 to m do begin pos[i]:=-1; len[i]:=1; end;
  seqi:=1;
  
  for i:=1 to pred(25) do begin
    if seq[i]<seq[succ(i)] then begin
      if pos[seqi]=-1 then pos[seqi]:=i;
      inc(len[seqi]);
    end else begin
      if pos[seqi]>=0 then inc(seqi);
    end
  end;
  maxlen:=1;
  for i:=2 to seqi do if len[i]>len[maxlen] then maxlen:=i;
  
  writeln('самая длинная последовательность начинается с позиции ',
    pos[maxlen],' и имеет длину ', len[maxlen])
end.

А можете решить математическим методом(условие, решение)?
Ответить