我遇到過這個問題。給定一個三角形,從上到下找到最小路徑和。您可以移動到下一行的相鄰數字的每一步。麻煩理解動態編程
[
[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