Pətək#5092

Pətək (Həll təhlili)

Bütün hüceyrələri soldan sağa, yuxarıdan aşağıya ardıcıl nömrələyək, şəkildə göstərildiyi kimi. Beləliklə:

Əgər yuxarı sırada hüceyrə varsa, onda yuxarı sıranın ən sağındakı hüceyrə 2n - 1 nömrəyə malik olacaq.

ilə birinci hüceyrədən nömrəsi olan hüceyrəyə çatmağın sayını göstərək. Arının 2n - 1 nömrəli hüceyrəyə çatmalı olduğundan, problemin cavabı f(2n - 1) əvəzləməsidir.

Hüceyrələr üzrə keçidləri nəzərdən keçirək.

f(k) = f(k - 2) + f(k - 3)
f(k) = f(k - 1)

Rekursiyası həyata keçirmək üçün başlanğıc dəyərlər tapmaq lazımdır:

f(1) = 1, f(2) = 1, f(3) = 1

Bunlar arının hərəkət ardıcıllığına asanlıqla yoxlanılır.

Alqoritmin həyata keçirilməsi

İşçi massiv elan edək.

#define MAX 100
int fib[MAX];

massivinin elementlərini rekursiv olma şərti ilə dolduraq.

fib[0] = 0; fib[1] = 1; fib[2] = 1;
for (int i = 3; i < MAX; i++)
  if (i % 2 == 1) fib[i] = fib[i-2] + fib[i-3];
  else fib[i] = fib[i-1];

dəyərini oxuyuruq və cavabı çıxarırıq f(2n - 1).

scanf("%d",&n);
printf("%d\n",fib[2*n-1]);

Alqoritmi həyata keçirilməsi – rekursiya + yaddaş

İşçi massiv elan edək.

int fib[90];

Məmoizasiya istifadə edərək f funksiyasının rekursiv hesablama keçirilməsini həyata keçirin.

int f(int n)
{
  if (n == 1) return 1;
  if (n == 2) return 1;
  if (n == 3) return 1;
  if (fib[n] != -1) return fib[n];
  if (n % 2 == 1) return fib[n] = f(n - 1) + f(n - 3);
  return fib[n] = f(n - 1);
}

Proqramın əsas hissəsi. Giriş dəyəri oxuyuruq.

scanf("%d",&n);

Hesablama və cavabı çıxarmaq.

memset(fib,-1,sizeof(fib));
printf("%d\n",f(2*n-1));

Java həyata keçirilməsi

import java.util.*;

public class Main
{
  static int fib[] = new int[90];    
  
  static int f(int n)
  {
    if (n <= 3) return 1;
    if (fib[n] != -1) return fib[n];
    if (n % 2 == 1) return fib[n] = f(n - 1) + f(n - 3);
    return fib[n] = f(n - 1);
  }
  
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    int n = con.nextInt();
    Arrays.fill(fib, -1);
    System.out.println(f(2*n-1));     
    con.close();
  }
}