64. Minimum Path Sum

  • 思路1

刚看到这道题的时候,第一个思路还是DFS,但是考虑到前面几个问题,怕DFS超时,所以直接使用DP。

  • 思路2 动态规划

题目中给出输入样例为:

DP需要维护一个二维数组,dp[i][j]表示到(i,j)的最短的路径和。

首先看两条边,两条边的走法比较单一,只能横着走过去或者竖着向下走,因此dp[i][j] = dp[i][j - 1] + grid[i][j]或dp[i][j] = dp[i - 1][j] + grid[i][j]。

当初始化完dp数组的两条边后,考虑图中标记五角星的地方,五角星可以横着走过去或者向下走过去,但是要考虑这两种走法那种路径和比较小。,因此五角星地区的状态转移方程为:dp[i][j] = min(dp[i - 1][j] + grid[i][j],dp[i][j - 1] + grid[i][j])。

C++代码实现:

class Solution 
{
public:
	int minPathSum(vector<vector<int>>& grid) 
	{
		int row = grid.size();
		int col = grid.at(0).size();
		int i, j;
		//声明一个dp数组
		vector<vector<int>> dp(row, vector<int>(col));

		for (i = 0;i < row;i++)
		{
			for (j = 0; j < col; j++)
			{
				dp[i][j] = grid[i][j];
			}
		}

		for (i = 0;i < 1;i++)
		{
			for (j = 1;j < col;j++)
			{
				dp[i][j] = dp[i][j - 1] + grid[i][j];
			}
		}

		for (j = 0; j < 1; j++)
		{
			for (i = 1; i < row; i++)
			{
				dp[i][j] = dp[i - 1][j] + grid[i][j];
			}
		}
		//根据状态转移方程求解
		for (i = 1;i < row; i++)
		{
			for ( j = 1; j < col; j++)
			{
				dp[i][j] = min(dp[i - 1][j] + grid[i][j],dp[i][j - 1] + grid[i][j]);
			}
		}

		return dp[row - 1][col - 1];
	}
};
原文地址:https://www.cnblogs.com/Manual-Linux/p/11601897.html