📌  相关文章
📜  到达目的地的最低初始点(1)

📅  最后修改于: 2023-12-03 15:36:57.380000             🧑  作者: Mango

题目描述

给定一个二维矩阵,其中每个元素表示从当前位置可以行进的方向,当值为0时表示该位置无法到达。从矩阵的左上角出发,到达矩阵的右下角需要经过的最小起始点(起点坐标为(0,0))。

算法分析

本题可以使用动态规划算法进行求解。

设$dp[i][j]$表示从左上角到(i,j)的最小起始点,则$dp[i][j]$可以从$dp[i-1][j]$和$dp[i][j-1]$中的最小值转移而来。转移方程为:

$$ dp[i][j] = \begin{cases} \infty, &\text{matrix[i][j] = 0}\ 0, &\text{ i = 0 and j = 0} \ \min(dp[i-1][j], dp[i][j-1]) + 1, &\text{otherwise} \end{cases} $$

最终所求的结果即为$dp[m-1][n-1]$,其中$m$和$n$分别为矩阵的行数和列数。

时间复杂度为$O(mn)$,空间复杂度为$O(mn)$。

代码实现
def min_start_point(matrix):
    m, n = len(matrix), len(matrix[0])
    dp = [[float('inf') for _ in range(n)] for _ in range(m)]

    for i in range(m):
        for j in range(n):
            if matrix[i][j] == 0:
                continue
            if i == 0 and j == 0:
                dp[i][j] = matrix[i][j]
            else:
                dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j]

    return dp[m-1][n-1]

其中,matrix为二维矩阵,返回结果为所求的最少起始点。

总结

到达目的地的最低初始点,即求从起点到终点经过的最小点数。本题可以使用动态规划算法求解。