首相的密道
背景 在伊耿的征服战争初始的时候,他在现今君临的位置第一次踏上维斯特洛大陆。在君临三座高丘最高的,被称为伊耿高丘的那一座顶上,他用泥土和木材建立了他的第一座要塞。在征服七国以后,伊耿下令在这丘顶上建立一座皇家城堡。这个工程在梅葛一世统治期间完工,他杀掉了所有建筑工人以免泄露城堡内部的秘密。 红堡中有很多座建筑。首相塔是其中的一座。首相塔是国王之手的寝室。 描述 首相塔的塔顶有一个秘密的房间。提利昂忽然对它起了兴趣。
首相塔用一个三角形表示,自顶向下有N层,第i层有i个房间。 每个房间有通向左边,右边,左上方和右上方房间的密道。 通过密道到达房间需要花费一定的时间。 提利昂决定算算他最少需要多久才能到达塔顶。 输入第一行一个整数n(2<=n<=1000)。 第二行到第n+1行,第i+1行有i个整数,每个数表示提利昂通过密道到达这个房间所用的时间。每个整数在0到100之间。 输出一个整数,提利昂所用的最少时间。 样例输入
5
样例输出10
这道题跟leetcode 120的题很想似,不过是增加可同行移动。
方法:自底向上叠加路径,每次都保存到达当前元素经过路径的最小值。
若想从上向下叠加请参考leetcode120题的解题方法。以下是代码实现
<?php
$arr = [[1],[12,3],[4,5,2],[10,1,1,8],[1,1,4,5,6]];
echo minPath($arr);
//国王的密道
function minPath($arr){
$row = count($arr);
$sum = $arr[$row-1][0];
for($i=1;$i<count($arr[$row-1]);$i++){
$sum += $arr[$row-1][$i];
$arr[$row-1][$i] = $sum;
}
for($i=$row-2;$i>=0;$i--){
for($j=0;$j<count($arr[$i]);$j++){
if($j==0){
$arr[$i][$j] += min($arr[$i+1][$j],$arr[$i+1][$j+1]);
}else{
$arr[$i][$j] += min(min($arr[$i+1][$j],$arr[$i+1][$j+1]),$arr[$i][$j-1]);
}
}
}
return $arr[0][0];
}