Я столкнулся с этой проблемой. Учитывая треугольник, найдите минимальную сумму пути сверху вниз. На каждом шаге вы можете перейти к соседним номерам в строке ниже.Устранение неполадок динамического программирования
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
Это пример динамического программирования. Но очень сложная или запутанная концепция для меня, когда я приступаю к упражнению. Я смотрел видео и читал учебники в Интернете, и сначала это кажется довольно простым, но когда я подхожу к проблеме, я полностью теряюсь. Так я нашел решение в оперативном режиме и использует нижний подход:
public init minmumTotal(ArrayList<ArrayList<Integer>> triangle) {
if (triangle.size() == 0 || triangle == null)
return 0;
int[] dp = new int[triangle.size()+1]; // store each index’s total
for (int i = triangle.size()-1; i >=0; i--) {
for (int j = 0; j < triangle.get(i).size(); j++) {
// first round: dp[j], dp[j+1] are both 0
dp[j] = Math.min(dp[j], dp[j+1]) + triangle.get(i).get(j);
}
}
return dp[0];
}
кажется легким после прохождения через раствор. Но можно ли это сделать, используя подход сверху вниз? И может ли кто-нибудь объяснить, почему нижний подход лучше, чем подход сверху вниз? Также когда целесообразно использовать сверху вниз или снизу вверх? А также, поскольку вопрос упоминается, что каждый "Each step you may move to adjacent numbers on the row below."
Означает ли это, что для каждой строки повторяется весь столбец, прежде чем я перехожу в следующую строку?
@marstan Почему не сверху вниз? – user3497437
Я думал, что лучше идти снизу, потому что в итоге вы получаете только одно число. Если вы сделаете это сверху, вы получите 4 номера. Затем вам нужно будет найти минимум после выполнения трех других шагов. – marstran
@martan о да, вы правы – user3497437