62.不同路径/63. 不同路径 II/64. 最小路径和

版权声明:只要梦想一天,只要梦想存在一天,就可以改变自己的处境。 https://blog.csdn.net/dongyanwen6036/article/details/86437609
62.不同路径

Title:有一个机器人的位于一个M×N个网格左上角(下图中标记为’Start’)。
机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角(下图中标记为’Finish’)。
问有多少条不同的路径?

注意事项n和m均不超过100
来自[1]

Analysis:
典型的动态规划问题
容易分析出状态转移方程:
dp[i][j] = dp[i-1][j] + dp[i][j-1];
初始条件,就是第一列和第一行,因为只能向下或向右走,所以,第一列和第一行的值都为1.

class Solution {
 public:
	 int uniquePaths(int m, int n) {
		 if (0 > m || n < 0 || m>100 || n > 100)return 0;
		 vector<vector<int>>res(m, vector<int>(n, 1));
		 for(int i=1;i<m;i++)
			 for (int j = 1; j < n; j++)
			 {
				 res[i][j] = res[i - 1][j] + res[i][j-1];
			 }
		 
		 return res[m - 1][n - 1];
	 }
 };
static const auto kSpeedUp = []() {
	 std::ios::sync_with_stdio(false);
	 std::cin.tie(nullptr);
	 return nullptr;
 }();
63. 不同路径 II

和上一题一样,就是注意在初始状态时都初始为0。在全过程中,一遇到障碍物时就设置为0.
AC 0 ms:

class Solution {
 public:
	 int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid){
		 int m = obstacleGrid.size(), n = obstacleGrid[0].size();
		 if (0 >= m || n <= 0 || m>100 || n > 100)return 0;
		 vector<vector<int>>res(m, vector<int>(n, 0));
		 //初始状态
		 for (int i = 0; i < m; i++)
			 if (obstacleGrid[i][0] == 0)
				 res[i][0] = 1;
			 else
				 break;
			 
		 for (int i = 0; i < n; i++)
			 if (obstacleGrid[0][i] == 0)
				 res[0][i] = 1;
			 else
				 break;

		 for(int i=1;i<m;i++)
			 for (int j = 1; j < n; j++)
			 {
				 if (obstacleGrid[i][j] == 0)
					 res[i][j] = res[i - 1][j] + res[i][j - 1];
				 else
					 res[i][j] = 0;
			 }
		 
		 return res[m - 1][n - 1];
	 }
 };
 static const auto kSpeedUp = []() {
	 std::ios::sync_with_stdio(false);
	 std::cin.tie(nullptr);
	 return nullptr;
 }();
64. 最小路径和
 class Solution {
 public:
	 int minPathSum(vector<vector<int>>& grid) {
		 int m = grid.size(), n = grid[0].size();
		 if (0 >= m || n <= 0)return 0;
		 vector<vector<int>>res(m, vector<int>(n, 0));
		 //和62,63一样先初始化边界值,动态规划思想一样
		 res[0][0] = grid[0][0];
		 for (int i = 1; i < m; i++)
			 res[i][0] = grid[i][0]+res[i-1][0];
		 for (int i = 1; i < n; i++)
			 res[0][i] = grid[0][i]+res[0][i-1];

		 for(int i=1;i<m;i++)
			 for (int j = 1; j < n; j++)
				 res[i][j]=grid[i][j]+ min(res[i - 1][j],res[i][j - 1]);
		 return res[m - 1][n - 1];
	 }
 };
 static const auto kSpeedUp = []() {
	 std::ios::sync_with_stdio(false);
	 std::cin.tie(nullptr);
	 return nullptr;
 }();

[1]https://www.jianshu.com/p/659b821c3e3e

猜你喜欢

转载自blog.csdn.net/dongyanwen6036/article/details/86437609
今日推荐