Жабка#9628

Жабка (Розбір)

Нехай містить найменшу вартість переміщення жаби на камінь . Тоді:

На i~(i \ge 3)-ий камінь жаба може стрибнути:

Звідси

dp[i] = min( dp[i - 1] + |h_i - h_{i-1}|, dp[i - 2] + |h_i - h_{i-2}| )

Приклад

Для наведеного прикладу шлях жаби вартістю 20 + 10 = 30 має вигляд:

Вправа

Заповніть масив для наступного прикладу:

Реалізація алгоритму

Оголосимо робочі масиви.

#define MAX 100001
int h[MAX], dp[MAX];

Читаємо вхідні дані. Висоти каменів заносимо в масив .

scanf("%d", &n);
for (i = 1; i <= n; i++)
  scanf("%d", &h[i]);

Ініціалізуємо і .

dp[1] = 0;  
dp[2] = abs(h[2] - h[1]);

Вираховуємо значення dp[i]~(3 \le i \le n).

for (i = 3; i <= n; i++)
{
  a = dp[i - 1] + abs(h[i] - h[i - 1]);
  b = dp[i - 2] + abs(h[i] - h[i - 2]);
  dp[i] = min(a, b);
}

Виводимо відповідь.

printf("%d\n", dp[n]);

Java реалізація

import java.util.*;
 
class Main
{
  static int h[], dp[];
 
  public static void main(String[] args)
  {
    Scanner con = new Scanner(System.in);
    int n = con.nextInt();
    h = new int[n+1];
    dp = new int[n+1];
    for(int i = 1; i <= n; i++)
      h[i] = con.nextInt();
   
    dp[1] = 0;  dp[2] = Math.abs(h[2] - h[1]);
    for (int i = 3; i <= n; i++)
    {
      int a = dp[i - 1] + Math.abs(h[i] - h[i - 1]);
      int b = dp[i - 2] + Math.abs(h[i] - h[i - 2]);
      dp[i] = Math.min(a, b);
    }
 
    System.out.println(dp[n]);
    con.close();
  }
}

Python реалізація

Читаємо вхідні дані. Висоти каменів заносимо в список .

n = int(input())
h = list(map(int, input().split()))

Ініціалізуємо список і присвоюємо значення і .

dp = [0] * (n + 1)
dp[1] = 0
dp[2] = abs(h[1] - h[0])

Вираховуємо значення dp[i]~(3 \le i \le n).

for i in range(3, n + 1):
  a = dp[i - 1] + abs(h[i - 1] - h[i - 2])
  b = dp[i - 2] + abs(h[i - 1] - h[i - 3])
  dp[i] = min(a, b)

Виводимо відповідь.

print(dp[n])