• LeetCode -- 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.

    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];
        }
    }
     
  • 相关阅读:
    HttpEntity转换Inputstream(红色)加XmlPull解析
    ImageLoader加载图片
    HttpClient——Get,Post
    Android例子源码非第三方实现根据字母排序的城市列表
    Android 仿QQ消息界面
    css折叠表格
    前端页面文字长度显示控制
    (首页上一页下一页尾页 + 下拉框跳转)分页功能
    基于bootstrap的分页插件
    HTML 禁止复制文字
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/5215157.html
Copyright © 2020-2023  润新知