当前位置:   article > 正文

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

给定一个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)(上方)的和,用递归的思想可以做出

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

方法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)

  1. int uniquePaths(int m, int n)
  2. {
  3. int N = n + m - 2;
  4. int K = n - 1;
  5. double res = 1.0;
  6. for (int i = 1; i <= n - 1; ++i)
  7. {
  8. res = res * (N - K + i) / i;
  9. }
  10. return (int)res;
  11. }

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/484299
推荐阅读
相关标签
  

闽ICP备14008679号