Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mybook11.05.12.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.22 Mб
Скачать

Входные данные

В первой строке входного файла записано число N – длина последовательности (1  N  1000). Во второй строке записана сама последовательность (через пробел). Числа последовательности – целые числа, не превосходящие 10000 по модулю.

Выходные данные

В выходной файл требуется вывести наибольшую длину возрастающей подпоследовательности и саму подпоследовательность.

Пример

Input.txt

Output.txt

4

1 4 2 3

3

1 2 3

Пусть L(i) обозначает максимальную длину последовательности, последним элементом которой является элемент с номером i. Тогда значение L(i+1) может в лучшем случае на 1 больше одного из тех значений L(j), j=1,...i-1, для которых выполняется соотношение А(j)<А(i), т.е. элемент с номером i может продлить подпоследовательность, последним элементом в которой был элемент с номером j. Максимальное значение L(i)i=1,...,N и соответствует решению задачи.

В массиве а будем хранить данную последовательность. В массиве b максимальные длины подпоследовательностей. В массиве с индексы элементоввозрастающих подпоследовательностей.

program naibol_vozvrast_podp_N2;

const nmax=1000;

var a,b,c:array[0..nmax]of longint; { 8) }

i,n,p,j,max,maxi:longint;

log:boolean;

procedure rec(v:longint); рекурсивная процедура вывода

подпоследовательности

begin

if b[v]=0 then exit;

rec (c[v]);

write(a[v],' ');

end;

begin

assign(input,'input.txt');

assign(output,'output.txt');

reset(input);

rewrite(output);

read(n);

fillchar(b,sizeof(n),0);

fillchar(c,sizeof(n),0);

for i:=1 to n do считываем массив

read(a[i]);

for i:=1 to n do массив b заполняем 1

b[i]:=1;

for i:=2 to n do делаем полный перебор, сохраняя лучшие

for j:=1 to i-1 do результаты в массиве b

begin

if a[j]<a[i] если нашли продолжение

последовательности

then

if b[i]<b[j]+1 если новое значение длины

последовательности лучше

then

begin b[i]:=b[j]+1;c[i]:=j; end; запоминаем его;

end;

max:=0;

for i:=1 to n do находим максимальную длину

подпоследовательности и

индекс последнего элемента этой подпоследовательности

if b[i]>max then

begin max:=b[i];maxi:=i;end;

writeln(max); выводим результат

rec (maxi);

close(input);

close(output);

end.

динампрогрзадачи

Задача 10 Деньги

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

Входные данные:

В первой строке текстового файла записано одно число N — количество купюр. Далее следует N чисел, задающие достоинства купюр. Далее следует число K — количество запросов. Далее следуют запросы, на каждый из которых следует дать ответ. Все числа во входном файле натуральные и не превосходят 103.

Выходные данные:

В выходном файле должно идти K чисел: 0, если соответствующую сумму набрать нельзя, 1 — если можно.

Пример:

Input.txt

Output.txt

2

2 4

2

3 2

0 1

Количество купюр одного достоинства неограничено.

Program many;

const nmax = 1010;

var

n, k,ans : longint;

s : array [0..nmax] of boolean;

begin

assign(input,’input.txt’);

assign(output,’output.txt’);

reset(input);

rewrite(output);

fillchar(s,sizeof(s),0);

s[0]:= true; сумму в 0 рублей набрать можно

read(n); считываем количество купюр

for i:= 1 to n do перебираем купюры

begin

read(x);

for j:= 0 to nmax-x do

if s[j] then s[j+x]:= true; если сумму j набрать можно, то имея купюру x можно набрать и сумму j+x

end;

read(k); считываем количество запросов

for i:= 1 to k do

begin

read(x); считываем сумму которую надо набрать

if s[x] если ее набрать можно

then write('1 ') выводим 1

else write('0 '); иначе 0

end;

close(input); close(output);

end.

динампрогрзадачи

Задача 11 Скобки

Вам необходимо определить количество правильных скобочных последовательностей, состоящих из N пар скобок.

Входные данные:

В единственной строке входного файла одно число N (1  N < 35).

Выходные данные:

Вывести одно число — искомое количество.

Пример:

Input.txt

Output.txt

3

5

Последовательность из 2*N скобок правильная, если для любого значения i (1<=i<=2*N), число открывающихся скобок больше или равно числу закрывающихся скобок и общее число открывающихся скобок в последовательности равно числу закрывающихся. Например: последовательность (()) правильная, а последовательности ()()) и ())(() неправильные.

Тогда надо посчитать кол-во правильных скобочных последовательностей длины N из круглых скобок. Это несложно посчитать динамикой. Обозначим кол-во таких последовательностей длины N за a[N]. Теперь решим данную задачу. Считая, что мы знаем количество таких последовательностей для первых N - 1 значений, найдем a[N].

Рассмотрим первую скобку в последовательности. Если она ( , то рассмотрим все возможные положения соответсвующей ей закрывающей скобки (j-ая позиция). При этом последовательность разбилась на две части: та что внутри этих скобок и та, что справа. Для каждой из этих частей мы уже знаем количество таких последовательностей: a[ j ] и a[N - j -1]. Поэтому можем найти ответ, просуммировав по j все такие произведения.

Program scobki;

const nmax = 1000;

var i, j, n: integer;

a: array[0..nmax] of extended;

Begin

assign(input, 'input.txt');

assign(output, 'output.txt');

reset(input); rewrite(output);

read(n);

a[0] := 1;

a[1] := 1;

for i := 2 to n do

For j := 0 to i - 1 do

a[i] := a[i] + a[j] * a[i - j - 1];

Writeln(a[n]:0:0);

Close(Input); Close(Output);

End.

динампрогрзадачи

Задача 12 Наибольшая последовательнократная подпоследовательность

Для заданной числовой последовательности найдите длину максимальной последовательнократной подпоследовательности в которой каждый элемент делится нацело на все предыдущие. Для последовательнократной подпоследовательности (ai, aj, …, ak) верно, что ai| aj | …| ak, когда I < J < K (выражение a|b эквивалентно b mod a=0).

Входные данные:

В первой строке текстового файла записано одно натуральное число N (N  1000) — количество чисел. Во второй строке N чисел, записанных через пробел. Числа по модулю не превосходят 109.

Выходные данные:

Выведите длину наибольшей последовательнократной подпоследовательности.

Пример:

Input.txt

Output.txt

4

3 -6 5 12

3

динампрогрзадачи

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]