1. 概述

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。
> 示例: 输入:

[

[1,3,1],

[1,5,1],

[4,2,1]

]

输出: 7

解释: 因为路径 1→3→1→1→1 的总和最小。

2. 解题

  1. <?php
  2. class Solution {
  3. public $way = [];
  4. /**
  5. * @param Integer[][] $grid
  6. * @return Integer
  7. */
  8. public function minPathSum($grid) {
  9. if (!$grid) {
  10. return 0;
  11. }
  12. $n = count($grid);
  13. $m = count($grid[0]);
  14. $this->dp($n, $m, $grid, [0, 0]);
  15. if (count($this->way) == 0) {
  16. return 0;
  17. }
  18. $min = array_sum($this->way[0]);;
  19. for ($i = 0; $i < count($this->way); $i++) {
  20. $min = min($min, array_sum($this->way[$i]));
  21. }
  22. return $min + $grid[0][0];
  23. }
  24. private function dp ($n, $m, $grid, $last, $way = []) {
  25. if ($last == [$n - 1, $m - 1]) {
  26. $this->way[] = $way;
  27. return;
  28. }
  29. if (isset($grid[$last[0]][$last[1] + 1])) { // 右
  30. $way[] = $grid[$last[0]][$last[1] + 1];
  31. $this->dp($n, $m, $grid, [$last[0], $last[1] + 1], $way);
  32. array_pop($way);
  33. }
  34. if (isset($grid[$last[0] + 1][$last[1]])) { // 下
  35. $way[] = $grid[$last[0] + 1][$last[1]];
  36. $this->dp($n, $m, $grid, [$last[0] + 1, $last[1]], $way);
  37. array_pop($way);
  38. }
  39. }
  40. }
  41. $grid = [
  42. [1,3,1],
  43. [1,5,1],
  44. [4,2,1]
  45. ];
  46. $cls = new Solution();
  47. $r = $cls->minPathSum($grid);
  48. echo $r;
  49. array_walk($cls->way, function (&$v){
  50. $v = implode(',', $v);
  51. });
  52. print_r($cls->way);