leetcode 62. 不同路径 (动态规划)

题目

在这里插入图片描述

思路

典型的动态规划问题

把m*n的地图看成m*n的二维数组dp,dp[i][j]的值是到该位置共有多少走法。
简单列出几个位置的走法后可以发现:dp[i][j]=dp[i-1][j]+dp[i][j-1];

这是因为:当到达位置(i-1,j)后,从(i-1,j)到(i,j)只有一种走法;同理,到达位置(i,j-1)后,从(i,j-1)到(i,j)只有一种走法。
最终得到上述递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];

初始状态:dp[1][1]=1…dp[1][n]=1;(行号、列号从1开始)

优化

从递推公式可看出,二维数组dp中,dp[i][j]只跟上方和前一个数有关,所以可优化dp为一维数组dp[n],
递推公式变为:dp[j]=dp[j]+dp[j-1];

c++代码

class Solution {
public:
	int uniquePaths(int m, int n) {
		int dp[101];
		for (int i = 1; i < 101; i++)dp[i] = 1; //初始状态
		for (int row = 2; row <= m; row++) //从第二行开始,计算到第m行
			for (int col = 2; col <= n; col++) //第一列不变,只计算前n列即可
				dp[col] += dp[col - 1];
		return dp[n];
	}
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值