百度笔试 9.3 A经

第一题类似于一个均值滤波,把四舍五入处理好即可。
第二题 dfs + dp
题目描述为给你一个矩阵,可以上下左右走,也可以重复走,每次从一个格子走到另一个格子都会有一个 cost,cost的计算方法为 abs(当前格子的值 - 目标格子的值),问从左上角走到右下角的最小 cost 为多少。

样例输入:
3
1 2 4
1 3 1
1 2 1
样例输出:
2

思路:刚开始想的是直接dfs,对走过的格子进行标记,不走回头路, + 剪枝。注意这里一定是要可以上下左右走,有的最小cost路线可能是弯曲的。提交后只通过了9%,提示超时。反思应该加一个 dp,把每个点的最小 cost 记录一下,就可以大幅度剪枝。再提交就通过了。

代码:

class Solution():
    def __init__(self):
        self.res = float('inf')
        self.directions = [(0,1),(1,0),(-1,0),(0,-1)]

    def dfs(self, mat, cur_i, cur_j, cur_score, dim, dp):

        if dp[cur_i][cur_j] <= cur_score:
            return
        else:
            dp[cur_i][cur_j] = cur_score

        if cur_i == dim - 1 and cur_j == dim - 1:
            if cur_score < self.res:
                self.res = cur_score
            return
        if cur_score >= self.res:
            return

        for m, n in self.directions:
            if cur_i + m < 0 or cur_i + m >= dim or\
               cur_j + n < 0 or cur_j + n >= dim:
                continue
            if mat[cur_i + m][cur_j + n] == -1:
                continue

            val = mat[cur_i][cur_j]
            mat[cur_i][cur_j] = -1

            self.dfs(mat, cur_i + m, cur_j + n, \
                     cur_score + abs(val - mat[cur_i + m][cur_j + n]), dim, dp)

            mat[cur_i][cur_j] = val



n = int(input())
mat = []
for _ in range(n):
    mat.append(list(map(int, input().split())))

dp = [[float('inf')] * n for _ in range(n)]
s = Solution()
s.dfs(mat, 0, 0, 0, n, dp)
print(s.res)

最近笔试的场次还挺多的,今天写完后发现已经在笔试中写了很多次 dfs + dp 的题目了,并且都是最后一题。看来笔试中此类题是高频题目,还是希望大家可以掌握。

全部评论
弯曲的最小路能给个例子么?
1 回复 分享
发布于 2020-09-03 21:18
我也是9% 但没有提示我超时
1 回复 分享
发布于 2020-09-03 23:41
我觉得应该是 最短路问题,我当时dp过了0.55,现在重写了,其实不用dp,用最短路
点赞 回复 分享
发布于 2020-09-03 22:12
第一题怎么做啊,纪念品
点赞 回复 分享
发布于 2020-09-03 22:25
第一题我用round四舍五入,这个有问题吗?我不管怎么调都是18%。
点赞 回复 分享
发布于 2020-09-03 23:55
迪杰斯特拉直接过
点赞 回复 分享
发布于 2020-09-04 11:37
您好,请问题目上不是说可以重复走格子么(不知道是不是我理解错了,一条到目标点的路径不能是有个节点被遍历两次吗。如果标记之后,在本轮dfs中,就不会再进入走过的格子了)。望解惑,谢谢
点赞 回复 分享
发布于 2020-09-04 14:41

相关推荐

dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
5 5 评论
分享
牛客网
牛客企业服务