LeetCode每日一题(931. Minimum Falling Path Sum)

Given an n x n array of integers matrix, return the minimum sum of any falling path through matrix.

A falling path starts at any element in the first row and chooses the element in the next row that is either directly below or diagonally left/right. Specifically, the next element from position (row, col) will be (row + 1, col - 1), (row + 1, col), or (row + 1, col + 1).

Example 1:

Input: matrix = [[2,1,3],[6,5,4],[7,8,9]]
Output: 13

Explanation: There are two falling paths with a minimum sum as shown.

Example 2:

Input: matrix = [[-19,57],[-40,-5]]
Output: -59

Explanation: The falling path with a minimum sum is shown.

Constraints:

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

dp[row][col]是经过 matrix[row][col]这点所能拿到的最小分数, 那就可以推导出 dp[row][col] = min(dp[row+1][col-1], dp[row][col], dp[row][col+1]), 因为我们可以从第一行里面任选一个元素开始下降, 所以 ans = min(dp[0][0], dp[0][1], …, dp[0]matrix[0].length - 1])


use std::collections::HashMap;

impl Solution {
    fn dp(
        matrix: &Vec<Vec<i32>>,
        row: usize,
        col: usize,
        cache: &mut HashMap<(usize, usize), i32>,
    ) -> i32 {
        if row == matrix.len() - 1 {
            return matrix[row][col];
        }
        let left = if col > 0 {
            if let Some(c) = cache.get(&(row + 1, col - 1)) {
                *c
            } else {
                Solution::dp(matrix, row + 1, col - 1, cache)
            }
        } else {
            i32::MAX
        };
        let right = if col < matrix[0].len() - 1 {
            if let Some(c) = cache.get(&(row + 1, col + 1)) {
                *c
            } else {
                Solution::dp(matrix, row + 1, col + 1, cache)
            }
        } else {
            i32::MAX
        };
        let bottom = if row < matrix.len() - 1 {
            if let Some(c) = cache.get(&(row + 1, col)) {
                *c
            } else {
                Solution::dp(matrix, row + 1, col, cache)
            }
        } else {
            i32::MAX
        };
        let ans = left.min(right).min(bottom) + matrix[row][col];
        cache.insert((row, col), ans);
        ans
    }

    pub fn min_falling_path_sum(matrix: Vec<Vec<i32>>) -> i32 {
        let mut cache = HashMap::new();
        let mut ans = i32::MAX;
        for col in 0..matrix[0].len() {
            ans = ans.min(Solution::dp(&matrix, 0, col, &mut cache))
        }
        ans
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值