https://leetcode.com/problems/minimum-path-sum/
本题大意:给出一个m*n的表格,里面存储了m*n个非负整数,在从左上角走到右下角的路径中(要求每次只允许向下或者向右一步),找出路径中经历的最小的数字之和。
解题思路:用f[i][j]表示从原点出发到第i行第j列所经历的最小和,则f[i][j]的前一步要么是f[i][j-1],要么是f[i-1][j],选择其中的最小值与该步本身的数字相加,就可以得到f[i][j]。但是要注意表格的边界要做特殊处理,边界上只有一个方向可以走。
从以上可以看出,该题是典型的动态规划。
代码如下:
1 class Solution { 2 public: 3 int minPathSum(vector<vector<int> >& grid) { 4 int row = grid.size(); 5 int col = grid[0].size(); 6 if(row == 0) return 0; 7 8 int f[row][col]; 9 for(int i = 0; i < row; i++) 10 { 11 for(int j = 0; j < col; j++) 12 { 13 f[i][j] = grid[i][j]; 14 } 15 } 16 for(int i = 0; i < row; i++) 17 { 18 for(int j = 0; j < col; j++) 19 { 20 if(i >= 1 && j >= 1) 21 { 22 f[i][j] += min(f[i-1][j], f[i][j-1]); 23 } 24 else if(i >= 1) f[i][j] += f[i-1][j]; 25 else if(j >= 1) f[i][j] += f[i][j-1]; 26 } 27 } 28 return f[row-1][col-1]; 29 } 30 };