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.

题意:给定一个方格,填满非负的数值,找出从左上角到右下角的一条路径,使路径和最小。只能向下或向右移动。

思路:用一维数组实现,对于第m次循环:更新前:dp[i]表示到达点(m-1, i)的最短路径和,dp[i+1]表示到达点(m-1, i+1)的最短路径和,即更新前存储上一行的点的最短路径更新后的dp[i-1]表示到达点(m, i-1)的点的最短路径和,即更新后表示该行的最短路径和更新方法是从左至右依次更新则到达点(m, i)的最短路径和为:sum = min{ dp[i-1]+grid[m][i], dp[i]+grid[m][i] }, 把sum值存入dp[i],则,更新后,dp[i]即是到达点(m, i)的最小路径和,更新后表示该行的对应值点的最小路径和。由于是从左至右依次更新,所以再利用更新后的dp[i],更新前的dp[i+1],更新dp[i+1]。

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

		for (int i = 1; i < m; i++){
			dp[0] += grid[i][0];
			for (int j = 1; j < n; j++){
				dp[j] = min(dp[j - 1] + grid[i][j], dp[j] + grid[i][j]);
			}
		}

		return dp[n - 1];
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值