题意:
解题思路:
思路:Time: O(n^2), Space: O(n^2)状态表示: dp(i, j): 从最下层走到坐标i, j的所有路径中的 最小和dp(0, 0) 为所求转移方程 : dp(i, j) = min(dp(i+1, j), dp(i+1, j+1)) + triangle(i, j) 第三层:6:[2,0] = 7; 5:[2,1] = 6; 7:[2,2] = 10; 第二层:3:[1, 0] = min([3+7],[3+6]) = 9; 第二层:4:[1, 1] = min([4+6],[4+10]) = 10 第一层 2:[0,0] = min(9, 10) + 2;
PHP代码实现:
class Solution { // Time: O(n^2), Space: O(n^2) function minimumTotal($triangle) { $n = count($triangle); $dp[$n - 1] = $triangle[$n - 1];// 最底层每个元素到达底部的最小路径 for ($i = $n - 2; $i >=0; $i--) {// 自下而上动态规划 for ($j = 0; $j < count($triangle[$i]); $j ++) { $dp[$i][$j] = min($dp[$i+1][$j], $dp[$i+1][$j+1]) + $triangle[$i][$j]; } } return $dp[0][0]; } //自上而下 // Time: O(n^2), Space: O(n^2) function minimumTotalTopDown($triangle) { $n = count($triangle); $dp[0][0] = $triangle[0][0]; for ($i = 1; $i < $n; $i++) { $dp[$i][0] = $dp[$i-1][0] + $triangle[$i][0]; $dp[$i][$i] = $dp[$i - 1][$i - 1] + $triangle[$i][$i]; for ($j = 1; $j < $i; $j++) { $dp[$i][$j] = min($dp[$i - 1][$j - 1], $dp[$i - 1][$j]) + $triangle[$i][$j]; } } return min($dp[$n - 1]); /* $min = $dp[$n - 1][0]; for ($i = 1; $i < $n; ++$i) { $min = min($min, $dp[$n - 1][$i]); } return $min;*/ } //递归超时 function minimumTotalRecursive($triangle) { return $this->dfs(0, 0, $triangle); } function dfs($x, $y, $triangle) { if ($x == count($triangle)) return 0; return $triangle[$x][$y] + min($this->dfs($x+1, $y, $triangle), $this->dfs($x + 1, $y + 1, $triangle)); }}
GO代码实现:
func minimumTotal(triangle [][]int) int { for i := len(triangle) - 2; i >= 0; i-- { for j := 0; j < len(triangle[i]); j++ { triangle[i][j] += min(triangle[i + 1][j], triangle[i + 1][j + 1]) } } return triangle[0][0]}func min(a, b int) int{ if a < b { return a } return b}