我遇到过这个问题。给定一个三角形,从上到下找到最小路径和。您可以移动到下一行的相邻数字的每一步。麻烦理解动态编程
[
[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