#!/usr/bin/python3 # Načtení vstupu ################ N,K,D=input().split() N=int(N) D=int(D) display=[int(i) for i in input().split()] # výš než nad maximální kontrast určitě nepůjdem K=max(i for i in display)+1 # Algoritmus na nejkratší cestu v DAGu: ####################################### # tabulka předchozích vrcholů na cestě prev=[[None for x in range(K)] for y in range(N)] # tabulka dočasných vzdáleností distance=[[float('inf') for x in range(K)] for y in range(N)] # relaxuje hranu a,b -> c,d def relax(a,b,c,d): weight=abs(d-display[c]) # váha hrany if distance[a][b]+weight < distance[c][d]: distance[c][d]=distance[a][b]+weight prev[c][d]=b # uložíme si předchozí vrchol # hledáme nejkratší cesty z 1. sloupce do posledního # postupujeme zleva doprava, tj. v topologickém uspořádání distance[0]=[abs(display[0]-x) for x in range(K)] for i in range(N-1): for j in range(K): # pro každé políčko ve sloupci... # ...zrelaxujem všechny jeho hrany for k in range(max(0,j-D),min(K,j+D+1)): relax(i,j,i+1,k) # najdem si tu nejkratší cestu... l=min(i for i in distance[N-1]) print(l) # uložíme si, jak v ní jdou vrcholy popořadě x=distance[N-1].index(l) path=[] i=N-1 while x!=None: path.insert(0,x) x=prev[i][x] i-=1 for i in range(N): print(path[i],end=(" " if i