百度笔试题——首相的密道

首相的密道

背景 在伊耿的征服战争初始的时候,他在现今君临的位置第一次踏上维斯特洛大陆。在君临三座高丘最高的,被称为伊耿高丘的那一座顶上,他用泥土和木材建立了他的第一座要塞。在征服七国以后,伊耿下令在这丘顶上建立一座皇家城堡。这个工程在梅葛一世统治期间完工,他杀掉了所有建筑工人以免泄露城堡内部的秘密。 红堡中有很多座建筑。首相塔是其中的一座。首相塔是国王之手的寝室。 描述 首相塔的塔顶有一个秘密的房间。提利昂忽然对它起了兴趣。
首相塔用一个三角形表示,自顶向下有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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值