Двумерное динамическое программирование.

3. Восстановление ответа.


Теперь напишем восстановление ответа. 
Точно так же, как и в одномерном случае будем идти на конечной клетке в начальную, на каждом шаге выбирая ту из возможных 
предшествующих клеток, для которой значение функции C меньше.

Answer = []
i = n
j = m
while (i, j) != (0, 0):
    Answer.append((i, j))
    prev_C = min(C[i][j - 1], C[i - 1][j], C[i - 1][j - 1])
    if C[i][j - 1] == prev_C:
        i, j = i, j - 1
    elif C[i - 1][j] == prev_C:
        i, j = i - 1, j
    else:
        i, j = i - 1, j - 1
Answer = Answer[::-1]