[leetcode] 64. Minimum Path Sum

Question:

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

Example 1:

[[1,3,1]
 [1,5,1]
 [4,2,1]]

Given the above grid map, return 7. Because the path 1→3→1→1→1 minimizes the sum.

Solution:

用动态规划,思路和做过的174. Dungeon Game是一样的,而且没那题那么复杂要考虑几种情况。
从最右下方开始往回遍历,状态转移方程为:

f(i, j) = min(f(i, j+1), f(i+1, j)) + nums(i, j)

即每次只可以去右边或者下边,选最小的那个走就行了。初始化时f(m, n) = nums(m, n) 并且注意边界的情况就好。

和174那题一样,空间上可以只用一维数组,可以用f(j+1) 代替 f(i, j+1) 因为f(j+1) 是最新更新的,用f(j) 代替f(i+1, j) 因为f(j) 是之前 (i-1) 那一层的。

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        if (grid.size() == 0)
            return 0;
        int m = grid.size(), n = grid[0].size();
        vector<int> dp(n, 0);
        dp[n-1] = grid[m-1][n-1];
        for (int j = n-2; j >= 0; j--)
            dp[j] = dp[j+1] + grid[m-1][j];

        for (int i = m-2; i >= 0; i--) {
            dp[n-1] += grid[i][n-1];
            for (int j = n-2; j >= 0; j--) {
                dp[j] = min(dp[j+1], dp[j]) + grid[i][j];
            }
        }

        return dp[0];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值