[Leetcode-64]Minimum Path Sum 二维数组路径最小和

来源:互联网 发布:剪切视频在线软件 编辑:程序博客网 时间:2024/05/18 22:12

0. 题目概要

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.

翻译:
一个mn列数组, 每个元素是一个非负数, 从左上角走到右下角, 每次只能朝右或者下走, 不能走出矩阵, 使得总和最小。


1. 分析:

m行n列, 共(m+n-2)步, (m-1)步向下, (n-1)步向右, 路径条数总共有C(m+n-2, m-1)

  1. dp[i][j] 表示从左上角到达(x, y)的最小值
  2. dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + a[i][j];
    • 从左边过来 dp[i][j-1] + a[i][j];
    • 从上边过来 dp[i-1][j] + a[i][j];
  3. 初值(下标从0开始)
    • dp[0][0] = a[0][0]
    • 第0行时候 从左边过来 dp[0][j>0] = dp[0][j-1] + a[i][j];
    • 第0列时候 从上边下来 dp[i>0][0] = dp[i-1][0] + a[i][j];
  4. 复杂度: 时间O(m*n) 空间(m*n)

2. AC代码

这里写图片描述

Submission Result: Accepted

class Solution {public:    int minPathSum(vector<vector<int>>& grid) {        int m = grid.size(), n = grid[0].size();        vector<vector<int> > dp(m, vector<int>(n)); // 初始化为m行n列的向量        for(int i=0; i< m; i++){            for(int j=0; j< n; j++){                if(i == 0){                    if(j==0){                        dp[i][j] = grid[i][j]; // grif[0][0]                    }else{                        dp[i][j] = dp[i][j-1] + grid[i][j]; // j != 0 从左边过来                    }                }else if( j == 0){                    dp[i][j] = dp[i-1][j] + grid[i][j];                }else{                    dp[i][j] = min(dp[i][j-1] , dp[i-1][j]) + grid[i][j];                }            }        }        return dp[m-1][ n-1];    }};