Динамічне програмування
Из попереднього міркування видно, що розв’язання цієї можна оформити рекурсивно. Але просте застосування цього прийому дуже просто можуть призвести до переповненню стека. Необхідно подбати оптимізацію рекурсивних проходів і обраховувати один і той ж значення кілька разів, зробити зване відсікання. Можна загалом відмовитися від рекурсії і вирішувати проблему «навпаки «— колись «вирішити… Читати ще >
Динамічне програмування (реферат, курсова, диплом, контрольна)
Динамическое программирование
Довольно часто на олімпіадах зустрічаються завдання, провокують до застосування алгоритми перебору. Але простий підрахунок числа варіантів переконує в неефективності такого підходу. Для таких завдань використовується метод динамічного програмування. Суть його у цьому, що з відшукання рішення поставленого завдання вирішується схожа (чи схожі), а більш проста. У цьому здійснюється перехід до ще більше простою й таке інше, доки сягають тривиальной.
Из попереднього міркування видно, що розв’язання цієї можна оформити рекурсивно. Але просте застосування цього прийому дуже просто можуть призвести до переповненню стека. Необхідно подбати оптимізацію рекурсивних проходів і обраховувати один і той ж значення кілька разів, зробити зване відсікання. Можна загалом відмовитися від рекурсії і вирішувати проблему «навпаки «— колись «вирішити «тривіальні випадки, та був переходити до дедалі складним. У авторських рішеннях таких завдань майже завжди зустрічається другий шлях (він трохи швидше), але нинішнього занятті розглянемо обидва — перший набагато доступнішими для понимания.
Для рішення завдань існує спеціальна теорія, велика заслуга у її створенні належить Р.Беллману. Загалом вигляді вона достатня складна, тому не розглядається. У той самий час конкретні завдання, розглянуті нижче, цілком можуть сформувати (хоча на інтуїтивному рівні) ідеї, які у основі вирішення завдань даного класса.
Первые дві завдання, слід сказати, не можна зарахувати до зазначеного класу, але прийоми, використані за її рішенні, дуже подібні з такими у завдань, аналізованих у цьому занятті. Інші завдання у свого часу зустрічалися в різних олімпіадах (і деякі відтоді стали «фольклорними ») і розташовано (на думку автора публікації) гаразд зростання складності. Для простоти вважатимемо, що у більшості завданнях вихідні дані такі, що результати вміститься в тип LongInt. Задля справедливості наголосимо, що таке обмеження існує завжди, й у двох завданнях доводиться або скористатися тип Double, або додатково реалізовувати «довгу арифметику » .
Числа Фибоначчи Вычислить N-ое число в послідовності Фібоначчі, — 1, 1, 2, 3, 5, 8, … — у якій перші двоє члена рівні одиниці, проте інші є суму двох предыдущих.
Формат вхідних данных Одно число 0.