📜  3-D 数组中的最小总和路径(1)

📅  最后修改于: 2023-12-03 14:38:51.716000             🧑  作者: Mango

3-D 数组中的最小总和路径

简介

在三维数组中找到一条从左上到右下的路径,使得路径上的所有数字之和最小。每次只能向下、向右或向前移动一步。

解题思路

可以通过修改动态规划算法来求解。设 $dp[i][j][k]$ 表示从 $(0,0,0)$ 到 $(i,j,k)$ 的最小总和路径,则有:

$$ dp[i][j][k] = \min{dp[i-1][j][k], dp[i][j-1][k], dp[i][j][k-1]} + arr[i][j][k] $$

其中,$arr[i][j][k]$ 表示三维数组中的元素值。

代码实现
def min_sum_path_3d(arr):
    m, n, p = len(arr), len(arr[0]), len(arr[0][0])
    dp = [[[0 for _ in range(p)] for _ in range(n)] for _ in range(m)]
    dp[0][0][0] = arr[0][0][0]
    
    for i in range(1, m):
        dp[i][0][0] = dp[i-1][0][0] + arr[i][0][0]
    for j in range(1, n):
        dp[0][j][0] = dp[0][j-1][0] + arr[0][j][0]
    for k in range(1, p):
        dp[0][0][k] = dp[0][0][k-1] + arr[0][0][k]
    
    for i in range(1, m):
        for j in range(1, n):
            for k in range(1, p):
                dp[i][j][k] = min(dp[i-1][j][k], dp[i][j-1][k], dp[i][j][k-1]) + arr[i][j][k]
    
    return dp[m-1][n-1][p-1]
示例
arr = [[[1,2,3],
        [4,5,6],
        [7,8,9]],
       
       [[10,11,12],
        [13,14,15],
        [16,17,18]],
       
       [[19,20,21],
        [22,23,24],
        [25,26,27]]]

res = min_sum_path_3d(arr)
print(res) # 74
复杂度分析

该算法的时间复杂度为 $O(mnp)$,空间复杂度为 $O(mnp)$,其中 $m,n,p$ 分别为三维数组的三个维度。