leetcode 64. Minimum Path Sum (简单 DP)
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.
- 思路:动态规划
空间
C++
class Solution {
public:
int minPathSum(vector<vector<int>>& a) {
int m=a.size(),n=a[0].size();
vector<vector<int>> f(m,vector<int>(n,INT_MAX));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(!i&&!j)f[i][j]=a[i][j];
else{
if(i>0)f[i][j]=min(f[i][j],f[i-1][j]+a[i][j]);
if(j>0)f[i][j]=min(f[i][j],f[i][j-1]+a[i][j]);
}
}
return f[m-1][n-1];
}
};
Java
- 这个实现修改了输入,emmm 空间算是 吧
class Solution {
public int minPathSum(int[][] a) {
int m=a.length,n=a[0].length;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(i>0&&j==0)a[i][j]+=a[i-1][j];
if(j>0&&i==0)a[i][j]+=a[i][j-1];
if(j>0&&i>0)
a[i][j]+=Math.min(a[i-1][j],a[i][j-1]);
}
return a[m-1][n-1];
}
}
Python
class Solution:
def minPathSum(self, a: List[List[int]]) -> int:
m=len(a)
n=len(a[0])
for i in range(m):
for j in range(n):
if i>0 and j==0:
a[i][j]+=a[i-1][j]
if j>0 and i==0:
a[i][j]+=a[i][j-1]
if i>0 and j>0:
a[i][j]+=min(a[i][j-1],a[i-1][j])
return a[m-1][n-1]
Go
func minPathSum(a [][]int) int {
m:=len(a)
n:=len(a[0])
for i:=0; i<m; i++{
for j:=0; j<n; j++{
if i>0 && j==0{
a[i][j]+=a[i-1][j]
}
if j>0 && i==0{
a[i][j]+=a[i][j-1]
}
if i>0 && j>0{
a[i][j]+=min(a[i][j-1],a[i-1][j])
}
}
}
return a[m-1][n-1]
}
func min(a, b int)int{
if a < b {
return a
}
return b
}
空间
C++
class Solution {
public:
int minPathSum(vector<vector<int>>& a) {
int m=a.size(),n=a[0].size();
vector<int> f(n,INT_MAX);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(!i&&!j)f[j]=a[i][j];
else{
if(i>0&&!j)f[j]=f[j]+a[i][j];
if(j>0&&!i)f[j]=f[j-1]+a[i][j];
if(i>0&&j>0)f[j]=min(f[j],f[j-1])+a[i][j];
}
}
return f[n-1];
}
};
Java
class Solution {
public int minPathSum(int[][] a) {
int m=a.length,n=a[0].length;
int[] f=new int[n];
f[0]=a[0][0];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(i>0&&j==0)f[j]=a[i][j]+f[j];
if(j>0&&i==0)f[j]=a[i][j]+f[j-1];
if(j>0&&i>0)
f[j]=Math.min(f[j],f[j-1])+a[i][j];
}
return f[n-1];
}
}
Python
class Solution:
def minPathSum(self, a: List[List[int]]) -> int:
m=len(a)
n=len(a[0])
f=[0]*n
f[0]=a[0][0]
for i in range(m):
for j in range(n):
if i>0 and j==0:
f[j]=a[i][j]+f[j]
if j>0 and i==0:
f[j]=a[i][j]+f[j-1]
if i>0 and j>0:
f[j]=min(f[j-1],f[j])+a[i][j]
return f[n-1]
Go
func minPathSum(a [][]int) int {
m:=len(a)
n:=len(a[0])
f:=make([]int,n)
f[0]=a[0][0]
for i:=0; i<m; i++{
for j:=0; j<n; j++{
if i>0 && j==0{
f[j]=a[i][j]+f[j]
}
if j>0 && i==0{
f[j]=a[i][j]+f[j-1]
}
if i>0 && j>0{
f[j]=a[i][j]+min(f[j-1],f[j])
}
}
}
return f[n-1]
}
func min(a, b int)int{
if a < b {
return a
}
return b
}