【排列组合】给定一个M*N的格子或棋盘,从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离)


版权声明:本文为CSDN博主「梵解君」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/hadeso/article/details/12622743

--------------------------------------------------------------------------------------------------------------------

解法1:我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(m,n)(坐标系的单位长度为小方格的变长)   

f(i, j)表示移动到坐标f(i, j)的走法总数,其中0=<i, j<=n,设f(m, n)代表从坐标(0,0)到坐标(m,n)的移动方法,

f(m, n) = f(m-1, n) + f(m, n-1).

于是状态f(i, j)的状态转移方程为:

f(i, j) = f(i-1, j) + f(i, j-1)    if i, j>0

f(i, j) = f(i, j-1)                  if i=0

f(i, j) = f(i-1, j)                  if j=0

优化的状态f(i, j)的状态转移方程为:

递归结束条件为:f(0,0)=0, f(0,1)=1, f(1,0)=1。这个问题可以在时间O(n^2),空间O(n^2)内求解。

递归解法

//递归解法
int process(int m, int n) {
    //永远不可能达到m & n同时为0的条件,除非输入m=n=0
    if (m == 0 && n == 0)
         return 0;
    if (m == 0 || n == 0)
         return 1;
    return process(m, n - 1) + process(m - 1, n);
}

非递归解法

int processNew(int m,int n){
      int **Q=new int*[m+1];
      for(int i=0; i<=m; ++i){
          Q[i]=new int[n+1]();
      }
      //初始化
      Q[0][0]=0;
      for(int j=1; j<=n; ++j)
          Q[0][j]=1;
     for(int i=1; i<=m; ++i)
         Q[i][0]=1;
     //迭代计算
     for(int i=1; i<=m; ++i){
         for(int j=1; j<=n; ++j){
             Q[i][j]=Q[i-1][j]+Q[i][j-1];
         }
     }
     int res=Q[m][n];
     delete [] Q;
     return res;
}

  

解法2:这个题目其实是一个组合问题。对方向编号,向上是0,向右是1,那么从左下角走到右上角一定要经过M 个1和N个0。这个题目可以转化为从M+N个不同的盒子中挑出M个盒子有多少种方法。答案是C(M+N, M),或者C(M+N, N)的组合数

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 从(0,0)到(m,n),每次走一步,只能向上或者向右走,有多少种路径走到(m,n) 最短路径(给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。) Leetcode练习(Python):数组类:第64题:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 一个n*n 的方格,要从左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走动的方法数。 矩阵从左上角向右下角走,每次只能向右或者向下移动,求经过最小的路径 不同路径(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 问总共有多少条不同的路径?) 我的border能自定义四角之border-radius : 左上角,右上角,左下角,右下角。 Leetcode练习(Python) :数组类:第62题:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 问总共有多少条不同的路径? 不同路径II(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。) Leetcode练习(Python):数组类:第63题:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM