动态规划第四题(LeetCode:62. 不同路径)

刚开始的时候没想初始化对递推公式的影响

        把递推公式复杂化了dp[i][j]=(i>0?dp[i-1][j]:0)+(j>0?dp[i][j-1]:0)

        加上了当前坐标左边和上边的合法判断

后面将第一行和第一列初始化为1后(因为这上面的坐标只能够从一个方向走来),就可以将递推公式化简:dp[i][j]=dp[i-1][j]+dp[i][j-1]

然后这一题还学到了二维vector带大小的定义,以前从来没用过:vector<vector<int>> dp(行数,vector<int> (列数,初始化的值?))----这里最后一个参数不知道是不是这个意思

int uniquePaths(int m, int n) {
	/*
	遇到要脑子的dp题就不会了(T.T)(最后还是靠自己想出来了)
	dp数组的含义
		需要定义为二维dp数组
		dp[i][j]代表从[0][0]到[i][j]有多少种走法
	递推公式
		因为robot只能向下或向右走
		不做初始化操作	
			所以判断当前坐标的左和上是否合法
			如果合法则相加
			**若该方向上的上一个坐标不合法则看作0(因为无法到达所以0种方法)
			即dp[i][j]=(i>0?dp[i-1][j]:0)+(j>0?dp[i][j-1]:0)
		做初始化操作
			直接dp[i][j]=dp[i-1][j]+dp[i][j-1];
	初始化
		需要将[0][0]初始化为1
		如果将第一行和第一列全部初始化为1
		可以节省时间
	遍历方式
		因为是二维数组
		所以按行从左到右遍历
	*/

	// 二维vector数组的定义我还真不会
	vector<vector<int>> dp(m,vector<int> (n));
	// 分别对第一列和第一行初始化操作
	for (int i = 0; i < m; i++)
		dp[i][0] = 1;
	for (int j = 0; j < n; j++)
		dp[0][j] = 1;
	// 根据递推公式遍历数组
	for (int i = 1; i < m; i++)
		for (int j = 1; j < n; j++)
			dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
	return dp[m - 1][n - 1];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值