• Source
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. int main() {
    5. ios::sync_with_stdio(false);
    6. cin.tie(nullptr);
    7.  
    8. int n;
    9. cin >> n;
    10.  
    11. int pole[300001];
    12. for (int i = 0; i <= n; i++) {
    13. cin >> pole[i];
    14. }
    15.  
    16. if (pole[0] == 1 || pole[n] == 1) {
    17. cout << -1 << "\n";
    18. return 0;
    19. }
    20.  
    21. int fib[50];
    22. fib[0] = 1;
    23. fib[1] = 2;
    24. int ilosc = 2;
    25. while (true) {
    26. fib[ilosc] = fib[ilosc - 1] + fib[ilosc - 2];
    27. if (fib[ilosc] > n) break;
    28. ilosc++;
    29. }
    30. int dp[300001];
    31. for (int i = 0; i <= n; i++) dp[i] = -1;
    32. dp[0] = 0;
    33. for (int i = 0; i <= n; i++) {
    34. if (dp[i] == -1) continue;
    35. for (int j = 0; j < ilosc; j++) {
    36. int nastepny = i + fib[j];
    37. if (nastepny <= n && pole[nastepny] == 0) {
    38. if (dp[nastepny] == -1 || dp[nastepny] > dp[i] + 1) {
    39. dp[nastepny] = dp[i] + 1;
    40. }
    41. }
    42. }
    43. }
    44. cout << dp[n] << "\n";
    45. return 0;
    46. }