【LeetCode】下降路径最小和

【LeetCode】下降路径最小和


The Begin点点关注,收藏不迷路

给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。

示例 1:
【LeetCode】下降路径最小和_第1张图片

输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

示例 2:

【LeetCode】下降路径最小和_第2张图片

输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

提示:

n == matrix.length == matrix[i].length
1 <= n <= 100
-100 <= matrix[i][j] <= 100

#include 
#include 

// 计算矩阵下降路径的最小和的函数
int minFallingPathSum(int** matrix, int matrixSize, int* matrixColSize) {
    // 创建动态规划数组 dp,dp[i][j] 表示到达 (i, j) 位置的最小下降路径和
    int **dp = (int **)malloc(matrixSize * sizeof(int *));
    for (int i = 0; i < matrixSize; i++) {
        dp[i] = (int *)malloc(matrixColSize[0] * sizeof(int));
    }
    // 初始化 dp 数组的第一行,与矩阵的第一行元素相同
    for (int j = 0; j < matrixColSize[0]; j++) {
        dp[0][j] = matrix[0][j];
    }
    // 从第二行开始计算最小下降路径和
    for (int i = 1; i < matrixSize; i++) {
        for (int j = 0; j < matrixColSize[0]; j++) {
            // 考虑三种可能的上一行的相邻位置
            int min_prev = dp[i - 1][j];
            if (j > 0) {
                // 考虑上一行左边相邻元素
                if (dp[i - 1][j - 1] < min_prev) {
                    min_prev = dp[i - 1][j - 1];
                }
            }
            if (j < matrixColSize[0] - 1) {
                // 考虑上一行右边相邻元素
                if (dp[i - 1][j + 1] < min_prev) {
                    min_prev = dp[i - 1][j + 1];
                }
            }
            // 更新 dp[i][j] 的值,为当前元素加上上一行相邻元素中的最小下降路径和
            dp[i][j] = matrix[i][j] + min_prev;
        }
    }
    // 找出最后一行中的最小下降路径和
    int min_sum = dp[matrixSize - 1][0];
    for (int j = 1; j < matrixColSize[0]; j++) {
        if (dp[matrixSize - 1][j] < min_sum) {
            min_sum = dp[matrixSize - 1][j];
        }
    }
    // 释放动态分配的内存
    for (int i = 0; i < matrixSize; i++) {
        free(dp[i]);
    }
    free(dp);
    return min_sum;
}

在这里插入图片描述


The End点点关注,收藏不迷路

你可能感兴趣的:(编程专栏,#,LeetCode‌,leetcode,算法,数组,动态规划,矩阵,数据结构,C语言)