标签:记录 min 问题 规划 简单算法 int for 最短路径算法 public
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。
class Solution { public: int minPathSum(vector<vector<int>>& grid) { //典型的最短路径算法,1->1 1->3 1->3->1->1->1 //问题在于这是道简单算法题,而我们用图算法来解,这样好吗? //我们用动态规划来做 //dp[i][j]记录走到此点最小的花费 //我们试一试, /* dp00=1 dp01=4 dp02=5 dp10=2 dp11=7 dp12=6 dp20=6 dp21=8 dp22=7 */ int m = grid.size(), n = grid[0].size(); int dp[m][n]; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if(i==0&&j==0) dp[i][j]=grid[i][j]; else if(i==0) dp[i][j]=grid[i][j] + dp[i][j - 1]; else if(j==0) dp[i][j]=grid[i][j] + dp[i-1][j]; else dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]); } } return dp[m - 1][n - 1]; } };
标签:记录 min 问题 规划 简单算法 int for 最短路径算法 public
原文地址:https://www.cnblogs.com/lsaejn/p/9763835.html