给定一个矩阵m*n,从左上角开始每次只能向右或者向下走,最后到右下角的位置共有多少种路径

题目描述

     给定一个矩阵m*n,从左上角开始每次只能向右或者向下走,最后到右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。

思路:  

1、排列组合

      要从A到B,必须向左走6步,向下也走6步,一共12步,我们可以从向下走入手,向下走的方法即从12步里选出6步向下,一共有C(12,6)种,因此从A到B的路线共有组合数C(12,6)种。

   对于m*n的格子,就是从m+n步中选出m步向下或n步向右,因此为C(m+n,m)=C(m+n,n)种。
--------------------- 
转载:https://blog.csdn.net/Code_7900x/article/details/78770814 

 

2、动态规划

1*1网格

因为只有一个网格,直接数就能数出路线数量,但是我们可以发现几条规律:

  • 从原点到(0,1)和(1,0)只有一条路线
  • 到达终点(1,1)的上一步只有(0,1)和(1,0)
  • 到达终点(1,1)的线路数等于到达(0,1)和(1,0)的线路数之和

3*3网格

根据我们之前得到的三条规律,无论网格是几乘几的,只要m=0或n=0,路线条数都为1,首先我们可以将这些点的路线条数初始为1,既然(1,1)的线路条数等于(0,1)与(1,0)线路条数的和,那么(1,2)的线路条数不就是(0,2)与(1,1)的线路条数的和吗,所以我们就能把每个点的线路条数都写出来了

m*n网格
根据前面总结的规则,我们可以推出求m*n网格的步骤:首先将m=0和n=0的点的线路条数都置为1,点(m,n)的线路条数等于点(m-1,n)与点(m,n-1)的线路之和,因为到达点(m,n)的上一步只有(m-1,n)和(m,n-1)
--------------------- 
转载:https://blog.csdn.net/rocsun01/article/details/89004668 

 

方法1:思想:dp[n][m]=dp[n-1][m]+dp[n][m-1]表示走到(n,m)位置的走法等于走到(n-1,m)(左边)加上(n,m-1)(上方)的和,用递归的思想可以做出


int way(int i,int j){
	if (i == 0 )//位于某一行,只有j种方法
		return j;
	else if (j == 0)//位于某一列,有i种方法
		return i;
	return way(nums, i - 1, j) + way(nums, i, j - 1);
}

方法2:组合问题:一共要走(n-1)+(m-1)次其中有(n-1)次要选择向下走,当选者好向下走的位置后向右走的位置也随之确定,即dp[n][m] = C(n+m-2, n-1),同理有(m-1)次选择向右走即dp[n][m] dp[n][m] = C(n+m-2, n-1) 
故:dp[n][m] = C(n+m-2, n-1) = C(n+m-2, m-1)

int uniquePaths(int m, int n)
{
	int N = n + m - 2;
	int K = n - 1;
	double res = 1.0;
	for (int i = 1; i <= n - 1; ++i)
	{
		res = res * (N - K + i) / i;
	}
	return (int)res;
}

转载:https://blog.csdn.net/liugg2016/article/details/82150122

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值