码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode -- Minimum Path Sum

时间:2016-02-24 22:25:22      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

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.

 

Analysis:

给出一个由非负数构成的 m * n 的网格,找出里面一条从左上角到右下角的最短路径。

注意:在每次行走的过程中,你只能往下或往右走。

 

思路:
1. 因为之前写过迷宫的程序,所以首先想到用迷宫的思路即由于只能往右或者往下走,而根据贪心算法,每次我们肯定选择一个代价最小的方向走。所以一般情况下只有一种选择,但是当往右走往下走代价相同时,我们不知道接下来该往哪个方向走代价会最小,所以需要用栈记录此时的信息得到所有可能的路径后,我们返回代价最小的那一条即可。
 思路肯定是没错的,但是尼玛程序老实出错%>_<%。
 
 
 
2. 参考了一点网上的思路,用动态规划,申请一块额外的空间,这样除了第一行和第一列只有一种来源之外,其他的都可能来源于左方或上方,因此用动态规划可以很容易的解决。
 
Answer:
Dynamic Programing。
public class Solution {
    public int minPathSum(int[][] rid) {
        if(rid == null || (rid.length == 0 && rid[0].length == 0)) return 0;
        if(rid.length == 1 && rid[0].length == 1) return rid[0][0];
        int row = rid.length, col = rid[0].length;
        int[][] dp = new int[row][col];
        dp[0][0] = rid[0][0];
        for(int i=0; i<row; i++) {
            for(int j=0; j<col; j++) {
                if(i == 0 && j == 0)
                    continue;
                else if(i == 0 && j != 0)
                    dp[i][j] = dp[i][j-1] + rid[i][j];
                else if(j == 0 && i != 0)
                    dp[i][j] = dp[i-1][j] + rid[i][j];
                else {
                    dp[i][j] = Math.min(dp[i][j-1], dp[i-1][j]) + rid[i][j];
                }
            }
        }
        return dp[row-1][col-1];
    }
}

 

 

LeetCode -- Minimum Path Sum

标签:

原文地址:http://www.cnblogs.com/little-YTMM/p/5215157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!