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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值