Очень динамическое программирование
Разделяй и властвуй, но помни!�Niccolò di Bernardo dei Machiavelli�Igor Mazurok
ПОПЫТКА ПЛАНА
Декомпозиция и рекурсия
Терминальный случай
Подходы к решению
Числа Фибоначчи
Динамика сверху вниз
#include <iostream>
#define MAX 100
using namespace std;
long long fib[MAX];
long long f(int n) {
if (n < 2) return n;
else if (fib[n] != 0) return fib[n];
else return fib[n] = f(n-1) + f(n-2);
}
int main() {
cout << f(87) << endl;
return 0;
}
Динамика снизу вверх
#include <iostream>
using namespace std;
long long f(int n) {
if (n < 2) return n;
else {
long long yesterday = 0, today = 1;
while(--n > 0) {
long long tomorrow = yesterday + today;
yesterday = today;
today = tomorrow;
}
return today;
}
}
int main() {
cout << f(87);
return 0;
}
Динамика снизу вверх
0 → Yesterday
1 → Today
? → Tomorrow
Динамика снизу вверх
0 → Yesterday
1 → Today
1 → Tomorrow
Динамика снизу вверх
0
1 → Yesterday
1 → Today
? → Tomorrow
Динамика снизу вверх
0 Yesterday
1 → Yesterday Today
1 → Today Tomorrow
? → Tomorrow
Динамика снизу вверх
0 Yesterday
1 → Yesterday Today
1 → Today Tomorrow
2 → Tomorrow
Динамика снизу вверх
0 Yesterday
1 Yesterday Today
1 → Yesterday Today Tomorrow
2 → Today Tomorrow
? → Tomorrow
Динамика снизу вверх
0 Yesterday
1 Yesterday Today
1 → Yesterday Today Tomorrow
2 → Today Tomorrow
3 → Tomorrow
Динамика снизу вверх
0 Yesterday
1 Yesterday Today
1 Yesterday Today Tomorrow
2 → Yesterday Today Tomorrow
3 → Today Tomorrow
? → Tomorrow
Динамика снизу вверх
0 Yesterday
1 Yesterday Today
1 Yesterday Today Tomorrow
2 → Yesterday Today Tomorrow
3 → Today Tomorrow
5 → Tomorrow
Динамика снизу вверх
0 Yesterday
1 Yesterday Today
1 Yesterday Today Tomorrow
2 Yesterday Today Tomorrow
3 → Yesterday Today Tomorrow
5 → Today Tomorrow
? → Tomorrow
Динамика снизу вверх
0 Yesterday
1 Yesterday Today
1 Yesterday Today Tomorrow
2 Yesterday Today Tomorrow
3 → Yesterday Today Tomorrow
5 → Today Tomorrow
8 → Tomorrow
…
Задача о двух единицах
Сколько существует битовых последовательностей длины N в которых не встречаются две единицы подряд?
Рассматриваем “короткие” случаи:
Задача о двух единицах
Ищем способ свести задачу вычисления f(N) к более “коротким”, т.е. к вычислению f(n<N).
Первый подход
Пусть у нас есть подходящая последовательность длины N-1.
Всего получаем f(N) = 2*f(N-2) + f(N-3)
Задача о двух единицах
Ищем способ свести задачу вычисления f(N) к более “коротким”, т.е. к вычислению f(n<N).
Второй подход
Пусть у нас есть подходящая последовательность длины N.
Итого f(N) = f(N-1) + f(N-2)
Задача о двух единицах
Какой ответ правильный?
Как из второй формулы получить первую?�А из первой вторую?
Задача о двух единицах
#656 Игра умножения
Слава и Оля играют в игру умножения – умножают целое число P на одно из чисел от 2 до 9. Слава всегда начинает с P=1, делает умножение, затем число умножает Оля, затем Слава и т.д. Перед началом игры им задают число N, и победителем считается тот, кто первым получит P ≥ N. Определить, кто выиграет при заданном N, если оба играют наилучшим образом.
long long n;�map <long long, bool> x;�
bool isWin(long long value) {� auto it = x.find(value);� if (it != x.end()) return it->second;� bool isCurWin = false;� for (int i = 2; i <= 9; i++) {� if(i*value >= n || !isWin(i*value)){� isCurWin = true;� break;� } }� x[value] = isCurWin;� return isCurWin;�}�int main() {� cin >> n;� if (isWin(1)) cout << "Stan wins.";� else cout << "Ollie wins.";� return 0;�}
Измените заголовок цикла так, чтобы не использовать “break”
Наидлиннейшая общая подстрока
Наибольшая общая подпоследоватльность
Расстояние Левенштейна и проверка орфографии
Оптимальное перемножение матриц
Задачи для самостоятельного решения
Задачи для самостоятельного решения