动态规划--2-矩阵中最小路径和

【题目】给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置,路径中所有数字累加起来就是路径和,返回所有路径的最小路径和,如果给定的m如下,那么路径1,3,1,0,6,1,0就是最小路径和,返回12. 
1 3 5 9 
8 1 3 4 
5 0 6 1 
8 8 4 0

      经典的动态规划问题:

      假设m是m行n列的矩阵,那么我们用dp[m][n]来抽象这个问题,dp[i][j]表示的是从原点到i,j位置的最短路径和。

              首先计算第一行和第一列,直接累加即可;

              那么对于其他位置,要么是从它左边的位置达到,要么是从上边的位置达到,我们取左边和上边的较小值,然后加上当前的路径值,就是达到当前点的最短路径。

 

#include 
#include 
using namespace std;

class Solution
{
public:
	int minPathSum(vector > num)
	{
		int row = num.size();
		int col = num[0].size();
		if (row == 0 || col == 0)
			return 0;
		vector >dp(row, vector(col, 0));	//二维数组初始化row行col列
		dp[0][0] = num[0][0];	//左上角第一个元素不动
		//第一行是前两个数相加
		for (int i = 1; i < col; ++i)
			dp[0][i] = dp[0][i - 1] + num[0][i];
		//第一列是上面的累加
		for (int i = 1; i < row; ++i)
			dp[i][0] = dp[i - 1][0] + num[i][0];
		//其他的都是取上面和左边最小的数和当前相加
		for (int i = 1; i < row; ++i)
		{
			for (int j = 1; j < col; ++j)
				dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + num[i][j];
		}
		return dp[row - 1][col - 1];
	}
private:
	int min(int m, int n)
	{
		return m < n ? m : n;
	}
};

int main()
{
	Solution s;
	vector< vector  >num{
		{1, 3, 5, 9},
		{8, 1, 3, 4},
		{5, 0, 6, 1},
		{8, 8, 4, 0} };
	cout << s.minPathSum(num) << endl;
	system("pause");
	return 0;
}

 

你可能感兴趣的:(剑指offer,----------动态规划)