Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, given the following triangle
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).
路径规划的php实现
两种方法:从顶向下叠加和从底向上叠加
以下给出的两种方法都未修改原数组。
<?php
$arr = [[2],[3,4],[6,5,2],[4,1,8,0]];
echo getMinPath($arr);
//top-bottom
function getMinPath($arr){
$res = array();
for($i=0;$i<count($arr);$i++){
for($j=0;$j<count($arr[$i]);$j++){
$res[$i][$j] = -1;
}
}
return minpath($arr,0,0,$res);
}
//注意要用&
function minpath($arr,$i,$j,&$res){
if($i == count($arr)-1){//最后一行
$min = $arr[$i][$j];
}else{
$min = min(minpath($arr,$i+1,$j,$res),minpath($arr,$i+1,$j+1,$res)) + $arr[$i][$j];
}
$res[$i][$j] = $min;
return $min;
}
//bottom-top
function getMinPath($arr){
$row = count($arr);
$res = array();
foreach ($arr[$row-1] as $value) {
$res[] = $value;
}
for($i=$row-2;$i>=0;$i--){
for($j=0;$j<count($arr[$i]);$j++){
$res[$j] = min($res[$j],$res[$j+1]) + $arr[$i][$j];
}
}
return $res[0];
}