Страница 1 из 1
Задача на динамическое программирование
Добавлено: 02 апр 2009, 19:53
Римма
Разработать алгоритм, находящий наибольшую возрастающую подпоследовательность данной последовательности из n чисел. Допускается, чтобы алгоритм работал за время порядка n^2 (но желательно за n*logn).
Большое спасибо!!!
Re: Задача на динамическое программирование
Добавлено: 03 апр 2009, 01:16
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.
Re: Задача на динамическое программирование
Добавлено: 03 апр 2009, 22:32
Римма
спасибо. но только вы не правильно меня поняли((
из последовательности например 1 3 17 4 19 30 2 90
должен быть ответ 1 3 17 19 30 90, т.к. там не сказано чтобы была последовательность по порядку

и за какое время она проходит: n^2 или n*logn?
Re: Задача на динамическое программирование
Добавлено: 03 апр 2009, 23:21
Esgal
вы уверенны в том что вас неправильно поняли?
Re: Задача на динамическое программирование
Добавлено: 04 апр 2009, 09:57
Римма
да, уверена. я у преподавателя спрашивала

Re: Задача на динамическое программирование
Добавлено: 23 дек 2013, 18:09
Z-Creed
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.
А можете решить математическим методом(условие, решение)?