if(dp[alt][i] != -1) {
return dp[alt][i];
}
lli(20) - a[alt][i] + calc(alt-1,i+1)
Вам просто (не) повезло, что программа не вызвала сбой!
Для alt == -1
вы читаете только какой-то случайный мусор в рекурсии. Вы читаете случайные значения из массива dp
.
Переключите их так, и это должно работать (или, по крайней мере, иметь определенное поведение):
if(i==n && alt==0) {
return 0;
}
if(alt>9 || alt<0 || i==n) {
return oo;
}
if(dp[alt][i] != -1) {
return dp[alt][i];
}
В любом случае, ваш подход просто не работает. Сначала вы проходите глубину (находит какой-либо путь!), Но порядок обхода сначала должен быть широким, чтобы найти кратчайший маршрут.
Это означает, что вы не можете использовать рекурсию, подобную этой, но вместо этого должны выполнять итерацию по alt
во внутреннем и i
во внешнем цикле. Затем вы можете заполнить поле пути шаг за шагом.
Такое наивное динамическое программирование - не лучшее решение для этой задачи. Вам лучше относиться к нему как к ориентированному взвешенному графу и применять стандартную Дейкстру. С помощью вашего метода вы рассчитаете (без необходимости) все возможные маршруты.