• [LeetCode] 64. Minimum Path Sum 最小路径和


    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:

    Input:
    [
      [1,3,1],
      [1,5,1],
      [4,2,1]
    ]
    Output: 7
    Explanation: Because the path 1→3→1→1→1 minimizes the sum.

    给定一个m x n 的含有非负整数的方格,从左上角移动到右下角,每次只能向下或者向右移动,找出最小的路径和。

    解法:动态归化(Dynamic Programming),

    State: dp[i][j],表示从(0, 0)到(i, j)最小的路径和

    Function: dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + grid[i][j]

    Initialize: dp[0][0] = grid[0][0]

    Return: dp[m - 1][n - 1] 

    Java:

    public class Solution {
        public int minPathSum(int[][] grid) {
            if (grid == null || grid.length == 0 || grid[0].length == 0) {
                return 0;
            }
    
            int M = grid.length;
            int N = grid[0].length;
            int[][] dp = new int[M][N];
    
            dp[0][0] = grid[0][0];
    
            for (int i = 1; i < M; i++) {
                dp[i][0] = dp[i - 1][0] + grid[i][0];
            }
    
            for (int i = 1; i < N; i++) {
                dp[0][i] = dp[0][i - 1] + grid[0][i];
            }
    
            for (int i = 1; i < M; i++) {
                for (int j = 1; j < N; j++) {
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
                }
            }
    
            return dp[M - 1][N - 1];
        }
    }
    

    Python:

    class Solution:
        # @param grid, a list of lists of integers
        # @return an integer
        def minPathSum(self, grid):
            m = len(grid); n = len(grid[0])
            dp = [[0 for i in range(n)] for j in range(m)]
            dp[0][0] = grid[0][0]
            for i in range(1, n):
                dp[0][i] = dp[0][i-1] + grid[0][i]
            for i in range(1, m):
                dp[i][0] = dp[i-1][0] + grid[i][0]
            for i in range(1, m):
                for j in range(1, n):
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
            return dp[m-1][n-1]  

    Python:

    class Solution:
        # @param grid, a list of lists of integers
        # @return an integer
        def minPathSum(self, grid):
            sum = list(grid[0])
            for j in xrange(1, len(grid[0])):
                sum[j] = sum[j - 1] + grid[0][j]
    
            for i in xrange(1, len(grid)):
                sum[0] += grid[i][0]
                for j in xrange(1, len(grid[0])):
                    sum[j] = min(sum[j - 1], sum[j]) + grid[i][j]
                    
            return sum[-1]

    Python: wo

    class Solution(object):
        def minPathSum(self, grid):
            """
            :type grid: List[List[int]]
            :rtype: int
            """
            m, n = len(grid), len(grid[0])
            dp = [[0] * n for i in xrange(m)]
            for i in xrange(m):
                for j in xrange(n):
                    if i == 0 and j == 0:
                        dp[i][j] = grid[i][j]
                    elif i == 0:
                        dp[i][j] = grid[i][j] + dp[i][j-1]
                    elif j == 0:
                        dp[i][j] = grid[i][j] + dp[i-1][j]
                    else:
                        dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
                        
            return dp[-1][-1]       

    Python:

    class Solution:
        """
        @param grid: a list of lists of integers.
        @return: An integer, minimizes the sum of all numbers along its path
        """
        def minPathSum(self, grid):
            for i in range(len(grid)):
                for j in range(len(grid[0])):
                    if i == 0 and j > 0:
                        grid[i][j] += grid[i][j-1]
                    elif j == 0 and i > 0:
                        grid[i][j] += grid[i-1][j]
                    elif i > 0 and j > 0:
                        grid[i][j] += min(grid[i-1][j], grid[i][j-1])
            return grid[len(grid) - 1][len(grid[0]) - 1]  

    C++:

    class Solution {
    public:
        /**
         * @param grid: a list of lists of integers.
         * @return: An integer, minimizes the sum of all numbers along its path
         */
        int minPathSum(vector<vector<int> > &grid) {
            // write your code here
            int f[1000][1000];
            if (grid.size() == 0 || grid[0].size() == 0)
                return 0;
            f[0][0] = grid[0][0];
            for(int i = 1; i < grid.size(); i++)
                f[i][0] = f[i-1][0] + grid[i][0];
            for(int i = 1; i < grid[0].size(); i++)
                f[0][i] = f[0][i-1] + grid[0][i];
            for(int i = 1; i < grid.size(); i++)
                for(int j = 1; j < grid[0].size(); j++)
                    f[i][j] = min(f[i-1][j], f[i][j-1]) + grid[i][j];
                    
            return f[grid.size()-1][grid[0].size()-1];
        }
    };

     

    类似题目:

    [LeetCode] 174. Dungeon Game 地牢游戏

     

    All LeetCode Questions List 题目汇总

      

  • 相关阅读:
    andriod获得textView的值设置textView的text
    Android 自动生成的R类
    andriod 启动日历
    ggplot2在一幅图上画两条曲线
    R语言中动态安装库
    Python中的动态类
    Python中将dict转换为kwargs
    Apache负载均衡
    Python codecs小Tips
    Matlab求三重积分
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8469442.html
Copyright © 2020-2023  润新知