题目源自于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];
else
value[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;
}
};