【发布时间】:2016-06-18 01:24:23
【问题描述】:
我遇到了这个问题。给定一个三角形,找到从上到下的最小路径和。每一步你都可以移动到下一行的相邻数字。
[
[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." 这是否意味着每行在我进入下一行之前迭代整个列?
【问题讨论】: