Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Чтобы научиться решать сложные задачи, надо с чего-то начинать.
Но в последней после статьи Василевского, мне кажется, сложно сказать что-то новое. Собираюсь включить ДП по профилю только из соображений системности изложения.
Для всех таких задач характерным является то, что каждый отдельный маршрут не может пройти два или более раз по одной и той же клетке.
misha@kihot:~/bred$ cat fib.c
#include <stdio.h>
int fib1(int n) {
if (n < 2) return 1;
else return fib1(n - 1) + fib1(n - 2);
}
int fib2(int n) {
int F[100], i;
F[0] = 1;
F[1] = 1;
for (i = 2; i <= n; i++) F[i] = F[i - 1] + F[i - 2];
return F[n];
}
int main(void) {
int i;
for (i = 0; i < 20; ++i) {
if (fib1(i) != fib2(i)) {
printf("PANIC!!! i=%d, fib1=%d, fib2=%d\n", i, fib1(i), fib2(i));
}
}
printf("Done\n");
return 0;
}
misha@kihot:~/bred$ gcc fib.c -o fib
misha@kihot:~/bred$ ./fib
Done
#include <stdio.h>
#include <math.h>
const double mag = sqrt(5.0);
const double gold = (mag+1)/2;
int fibo(int n) {
if (n == 2)
return 1;
return (pow(gold, n)-pow((1-gold), n))/mag;
}
int main() {
int n;
scanf("%d", &n);
printf("%d", fibo(n));
return 0;
}
int fib(int a, int b, int lim) {
return (lim <= 0) ? a : fib(b, a + b, lim - 1);
}
printf("%i\n", fib(0, 1, 40));

Динамическое программирование. Классические задачи