#include #include #include int abs(int n) { return n > 0 ? n : -n; } int main() { //1. Načtení výchozích hodnot HUDu int N, K, D; scanf("%d %d %d", &N, &K, &D); int *vychozi = malloc(N * sizeof(int)); for (int i = 0; i < N; i++) scanf("%d", &vychozi[i]); // 2. Inicializujeme si tabulku "vzdáleností" a "šipek" int **vzdalenost = malloc(N * sizeof(int *)); int **odkud = malloc(N * sizeof(int *)); for (int i = 0; i < N; i++) { vzdalenost[i] = malloc((K+1) * sizeof(int)); odkud[i] = malloc((K+1) * sizeof(int)); for (int j = 0; j <= K; j++) { vzdalenost[i][j] = INT_MAX/2; // Praktické nekonečno :-) odkud[i][j] = -1; } } // ... a naplníme její první sloupec for (int j = 0; j <= K; j++) vzdalenost[0][j] = abs(vychozi[0] - j); // 3. Projdeme postupně celou tabulku vzdáleností a počítáme nejlepší // cesty do i-té hladiny for (int i = 1; i < N; i++) { for (int j = 0; j <= K; j++) { // z každého políčka můžeme jít do rozmezí až o D jiné int dolni = j - D >= 0 ? j - D : 0; int horni = j + D <= K ? j + D : K; for (int a = dolni; a <= horni; a++) { int novadelka = vzdalenost[i-1][j] + abs(a-vychozi[i]); // Nová délka cesty if (vzdalenost[i][a] > novadelka) { vzdalenost[i][a] = novadelka; odkud[i][a] = j; } } } } // 4. Najdeme a vypíšeme tu nejlepší nalezenou variantu int *vystup = malloc(N * sizeof(int)); int minimum = vzdalenost[N-1][0]; vystup[N-1] = 0; for (int j = 1; j <= K; j++) { if (minimum > vzdalenost[N-1][j]) { minimum = vzdalenost[N-1][j]; vystup[N-1] = j; } } for (int i = N-2; i >= 0; i--) vystup[i] = odkud[i+1][vystup[i+1]]; printf("%d\n", minimum); for (int i = 0; i < N; i++) printf("%d ",vystup[i]); printf("\n"); }