#include /* int f(int n) { if (n == 0) return 1; int vsota = 0; for (int k = 1; k <= n; k++) { vsota += f(k-1) * f(n-k); } printf("Ravno sem izracunal f(%d)\n", n); return vsota; } */ // Problem je, da je stvar zelo počasna za n > 15 // To je zato, ker večkrat (prevečkrat) izračunamo iste // vrednosti - delamo si dodatno delo po nepotrebnem // Predelajmo funkcijo tako, da ne bo večkrat računala istih // vrednosti typedef long long ll; ll izracunano[1000]; // Temu pravimo "memoizacija" - je ena od dveh komponent dinamičnega // programiranja ll f(int n) { // ne delamo še enkrat istega if (izracunano[n] != 0) return izracunano[n]; if (n == 0) return 1; ll vsota = 0; for (int k = 1; k <= n; k++) { vsota += f(k-1) * f(n-k); } printf("Ravno sem izracunal f(%d)\n", n); // zabeležimo si rezultat, če ga bomo še kdaj potrebovali izracunano[n] = vsota; return vsota; } int main() { int n; scanf("%d", &n); printf("%lld\n", f(n)); return 0; }