Динамическое программирование на таблицах(46 задач)
Динамическое программирование по подстрокам(21 задач)
Задача о рюкзаке(34 задач)
Для заданного числа \(n\) найдите наименьшее положительное целое число с суммой цифр \(n\), которое делится на \(n\).
Во входном файле содержатся целое число \(n\) (1 ≤ \(n\) ≤ 1000).
Выходной файл должен содержать искомое число. Ведущие нули выводить не разрешается.
1
1
10
190
Толик только что узнал, что на свете существует двоичная система счисления. Обрадованный этим, он записал в столбик двоичные формы чисел 1, 2, …, \(n\). Получились числа 1, 10, 11, 100, 101, 110, 111, …
После этого он стер все написанные единицы и стал изучать расположение нулей. Он выбрал число \(k\) и в каждой строке, идя слева направо, выделил красным цветом каждый \(k\)-ый ноль, начиная с первого. Таким образом, оказались выделенными нули с номерами 1, \(k\) + 1, 2\(k\) + 1, … Например если \(k\) = 2, \(n\) = 56 то получились бы такие строки:
(красные нули выделены жирным шрифтом и подчеркнуты)
Теперь Толику интересно, сколько же ноликов он выделил. Помогите ему их посчитать.
Во входном файле содержатся числа \(n\) и \(k\) (1 ≤ \(n\) < \(2^{31}\), 1 ≤ \(k\) ≤ 30).
Выходной файл должен содержать одно число – количество красных нулей.
5 1
4
23 3
20
Даны две последовательности, требуется найти и вывести их наибольшую общую подпоследовательность.
В первой строке входных данных содержится число \(N\) – длина первой последовательности (1 ≤ \(N\) ≤ 1000). Во второй строке заданы члены первой последовательности (через пробел) – целые числа, не превосходящие 10000 по модулю.
В третьей строке записано число \(M\) – длина второй последовательности (1 ≤ \(M\) ≤ 1000). В четвертой строке задаются члены второй последовательности (через пробел) – целые числа, не превосходящие 10000 по модулю.
Требуется вывести наибольшую общую подпоследовательность данных последовательностей, через пробел.
3 1 2 3 3 2 3 1
2 3
Дана текстовая строка. С ней можно выполнять следующие операции:
1. Заменить один символ строки на другой символ.
2. Удалить один произвольный символ.
3. Вставить произвольный символ в произвольное место строки.
Например, при помощи первой операции из строки "СОК" можно получить строку "СУК", при помощи второй операции - строку "ОК", при помощи третьей операции - строку "СТОК.
Минимальное количество таких операций, при помощи которых можно из одной строки получить другую, называется стоимостью редактирования или расстоянием Левенштейна.
Определите расстояние Левенштейна для двух данных строк.
Программа получает на вход две строки, длина каждой из которых не превосходит 1000 символов, строки состоят только из заглавных латинских букв.
Требуется вывести одно число – расстояние Левенштейна для данных строк.
ABCDEFGH ACDEXGIH
3
Дана последовательность, требуется найти её наибольшую возрастающую подпоследовательность.
В первой строке входных данных задано число \(N\) - длина последовательности (1 ≤ \(N\) ≤ 1000). Во второй строке задается сама последовательность (разделитель - пробел). Элементы последовательности - целые числа, не превосходящие 10000 по модулю.
Требуется вывести наибольшую возрастающую подпоследовательность данной последовательности. Если таких подпоследовательностей несколько, необходимо вывести одну (любую) из них.
6 3 29 5 5 28 6
3 5 28