leetcode #64 in cpp

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.


Solution:

We use DP where dp[i][j] = minimum sum along the path from position(i+1,j+1) to the destination. 

Then dp[i][j] = min(dp[i+1][j], dp[i][j+1]) + grid[i][j]. That is, we select the direction which gives us a smaller sum, when we decide to take the next step.  


Code:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size(); 
        vector<vector<int>> dp(m, vector<int>(n,0));
        dp[m-1][n-1] = grid[m-1][n-1];
        for(int i = m-2; i >= 0; i --){//right border
            dp[i][n-1] = grid[i][n-1] + dp[i+1][n-1];
        }
        for(int i = n-2; i >= 0; i--){//bottom border
            dp[m-1][i] = grid[m-1][i]+dp[m-1][i+1];
         }
        for(int i = m-2; i >= 0; i --){
            for(int j = n-2; j>=0; j --){
                dp[i][j] = min(dp[i+1][j], dp[i][j+1])+grid[i][j];//compare results from turning right and turning down
            }
        }
        return dp[0][0];
    }
};

One optimization is to update the sum in place in grid instead of using the dp arrays. This saves us some memory. 
阅读更多
文章标签: cpp leetcode
个人分类: interview
想对作者说点什么? 我来说一句

LeetCode cpp最新中文题解.pdf

2018年01月10日 866KB 下载

没有更多推荐了,返回首页

不良信息举报

leetcode #64 in cpp

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭