矩阵上寻找最短路径 Minimum Path Sum

来源:互联网 发布:数据库管理系统dbms是 编辑:程序博客网 时间:2024/05/16 10:15

题目源自于leetcode。图问题。

题目: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.


思路:矩阵寻路问题。在某一个位置只有两种选择,向下或向右。在最右一列时只可以向下。在最下一行时是可以向右。要求在最左上角时到最右下角的最短长度。存在最优子问题:对中间的每个点,到最右下角的最短长度。并且子问题影响到了最终问题,并且是在相邻子问题中取最优。所以可以用动态规划来解,先从最小的子问题开始求解,逐步扩展到最大的问题(最左上角)。


注意:

1、二维数组的表示方法有vector,静态二维数组,动态二维数组。这里选用的是C++形式的动态二维数组。


代码:

class Solution {public:    int minPathSum(vector<vector<int> > &grid) {        int row = grid.size();        if(row == 0)            return 0;        int col = grid[0].size();int i,j;        int **value = new int* [row]; //动态二维数组的申请for(i=0;i<row;i++)value[i] = new int[col];value[row-1][col-1] = grid[row-1][col-1];for(i=row-2;i>=0;i--)value[i][col-1] = value[i+1][col-1] + grid[i][col-1];for(i=col-2;i>=0;i--)value[row-1][i] = value[row-1][i+1] + grid[row-1][i];for(i=row-2;i>=0;i--)for(j=col-2;j>=0;j--){if(value[i+1][j] < value[i][j+1])value[i][j] = value[i+1][j] + grid[i][j];elsevalue[i][j] = value[i][j+1] + grid[i][j];}int result = value[0][0];for(i=0;i<row;i++)//动态二维数组的释放 delete[] value[i];delete[] value;return result;    }};


原创粉丝点击