Помощь - Поиск - Пользователи - Календарь
Полная версия: Последовательность
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
sheka
Дана последовательность целых чисел. Путем удаления некоторых элементов (не переставляя элементы) получить неубывающую последовательность максимальной длины.
Думаю сделать так: найти самую длинную цепочку, запомнить с какого элемента она начинается и уже потом вывести.2й и 3й пункт сложности не представляют, а с первым проблемки...можно конечно кучей циклов фор...но мы не знаем количество элементов массива. Поэтому надо рекурсией. Вот мое чудо, которое в мозгах работает на отлично, а Паскаль не понимает))):
const
n=8;
{1 2 3 4 5 6 7 8 9 0 1}
m:array[1..n]of integer=(2,0,7,5,3,6,6,5);

var
p:integer;
nac:integer;
max:integer;

procedure find(p:integer;curr:integer);
var
i:integer;
qq:byte;
begin
for i:=p+1 to n do
begin
if m[p]<=m[i] then
begin
inc(curr);
if max<curr then
begin
max:=curr;
nac:=p;
end;
find(i,curr);
end;

for qq:=1 to n do write(qq,' '); writeln;
for qq:=1 to n do write(m[qq],' '); writeln;
writeln('p=',p);
writeln('i=',i);
writeln('m[',p,']=',m[p]);
writeln('m[',i,']=',m[i]);
writeln('curr=',curr);
writeln('nac=',nac);
writeln('max=',max);

readln;

end;
end;

begin
nac:=1;
find(1,1);
writeln('max=',max);
readln;
end.
ЗЫ А Watches работает только с глобальными переменными?
volvo
Цитата
можно конечно кучей циклов фор...но мы не знаем количество элементов массива. Поэтому надо рекурсией.
Правда что-ли? А если удобнее без рекурсии, что делать? Обязательно хочется написать рекурсивно? Вообще эта задача решается так, если не ошибаюсь:
const
n = 8;
type
Arr = array[0 .. pred(n)] of integer;

const
A: Arr = (2, 0, 7, 5, 3, 6, 6, 5);

var
B, C: Arr;
i, j, imax, ref: integer;

begin
imax := 0;
for i := pred(n) downto 0 do
begin
B[i]:=1;
for j := i+1 to pred(n) do
begin

if (A[j] >= A[i]) and (B[i] < B[j] + 1) then
begin
B[i] := B[j]+1;
C[i] := j;
if B[j] = imax then break;
end;
end;
if B[i] > imax then imax := B[i];
end;

for i := 0 to pred(n) do
if B[i] = imax then break;

ref := i;
for j := 0 to pred(imax) do
begin
write(A[ref]:4); ref := C[ref];
end;
end.


Цитата
А Watches работает только с глобальными переменными?
С чего ты взял? С любыми работает... А еще есть Call Stack, тоже очень удобно отлаживать рекурсию...
sheka
Напишите, пожалуйста, логику Вашего решения.
И, если не тяжело, посмотрите что у меня не так. уже часов 5 на нее убил.
у меня watches вообще проскакивает рекурсивную процедуру, вот и приходилось выводить все данные)
volvo
Цитата
Напишите, пожалуйста, логику
АлгоЛист: Рекуррентные соотношения и динамическое программирование см. задачу №20

Цитата
у меня watches вообще проскакивает рекурсивную процедуру
Watches - это окно просмотра переменных при отладке. Оно не может ничего проскакивать. Используй Трассировку (F7), а не F8, тогда не будет ничего проскакивать. Ссылка в тему
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.