您的位置:首页 > 其它

leetCode刷题归纳-Dynamic Programming(64. Minimum Path Sum)

2017-06-10 13:46 435 查看

题目描述

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.

解题思路

求从左上角到右下角加权最短路径的问题,只能向右或者向下移动,和之前那个求unique path的问题很相似,只是在处理的过程中将最优化目标换成当前的加权和,解法如下

(1)二维数组表示状态,空间复杂度O(m*n)

class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m=grid.size();
int n=grid[0].size();
vector<vector<int>>sum(m,vector<int>(n,grid[0][0]));
for(int i=1;i<m;i++)
sum[i][0]=sum[i-1][0]+grid[i][0];
for(int j=1;j<n;j++)
sum[0][j]=sum[0][j-1]+grid[0][j];
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
sum[i][j]=min(sum[i-1][j],sum[i][j-1])+grid[i][j];
return sum[m-1][n-1];
}
};


(2)一维数组表示状态,空间复杂度O( min(m,n) )

class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m=grid.size();
int n=grid[0].size();
vector<int>cur(m,grid[0][0]);

for(int i=1;i<m;i++)
cur[i]=cur[i-1]+grid[i][0];

for(int j=1;j<n;j++){
cur[0]+=grid[0][j];
for(int i=1;i<m;i++)
cur[i]=min(cur[i-1],cur[i])+grid[i][j];
}
return cur[m-1];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: