题意:

image.png

解题思路:

  1. 思路:Time: O(n^2), Space: O(n^2)
  2. 状态表示: dp(i, j): 从最下层走到坐标i, j的所有路径中的 最小和dp(0, 0) 为所求
  3. 转移方程 : dp(i, j) = min(dp(i+1, j), dp(i+1, j+1)) + triangle(i, j)
  4. 第三层:6:[2,0] = 7; 5:[2,1] = 6; 7:[2,2] = 10;
  5. 第二层:3:[1, 0] = min([3+7],[3+6]) = 9;
  6. 第二层:4:[1, 1] = min([4+6],[4+10]) = 10
  7. 第一层 2:[0,0] = min(9, 10) + 2;

PHP代码实现:

  1. class Solution {
  2. // Time: O(n^2), Space: O(n^2)
  3. function minimumTotal($triangle) {
  4. $n = count($triangle);
  5. $dp[$n - 1] = $triangle[$n - 1];// 最底层每个元素到达底部的最小路径
  6. for ($i = $n - 2; $i >=0; $i--) {// 自下而上动态规划
  7. for ($j = 0; $j < count($triangle[$i]); $j ++) {
  8. $dp[$i][$j] = min($dp[$i+1][$j], $dp[$i+1][$j+1]) + $triangle[$i][$j];
  9. }
  10. }
  11. return $dp[0][0];
  12. }
  13. //自上而下
  14. // Time: O(n^2), Space: O(n^2)
  15. function minimumTotalTopDown($triangle) {
  16. $n = count($triangle);
  17. $dp[0][0] = $triangle[0][0];
  18. for ($i = 1; $i < $n; $i++) {
  19. $dp[$i][0] = $dp[$i-1][0] + $triangle[$i][0];
  20. $dp[$i][$i] = $dp[$i - 1][$i - 1] + $triangle[$i][$i];
  21. for ($j = 1; $j < $i; $j++) {
  22. $dp[$i][$j] = min($dp[$i - 1][$j - 1], $dp[$i - 1][$j]) + $triangle[$i][$j];
  23. }
  24. }
  25. return min($dp[$n - 1]);
  26. /*
  27. $min = $dp[$n - 1][0];
  28. for ($i = 1; $i < $n; ++$i) {
  29. $min = min($min, $dp[$n - 1][$i]);
  30. }
  31. return $min;*/
  32. }
  33. //递归超时
  34. function minimumTotalRecursive($triangle) {
  35. return $this->dfs(0, 0, $triangle);
  36. }
  37. function dfs($x, $y, $triangle) {
  38. if ($x == count($triangle)) return 0;
  39. return $triangle[$x][$y] + min($this->dfs($x+1, $y, $triangle), $this->dfs($x + 1, $y + 1, $triangle));
  40. }
  41. }

GO代码实现:

  1. func minimumTotal(triangle [][]int) int {
  2. for i := len(triangle) - 2; i >= 0; i-- {
  3. for j := 0; j < len(triangle[i]); j++ {
  4. triangle[i][j] += min(triangle[i + 1][j], triangle[i + 1][j + 1])
  5. }
  6. }
  7. return triangle[0][0]
  8. }
  9. func min(a, b int) int{
  10. if a < b {
  11. return a
  12. }
  13. return b
  14. }