【排列組合】給定一個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刪除。



猜您在找 最短路徑(給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。) 一個n*n 的方格,要從左上角走到右下角,一次只能往右或往下走一步,求算法得出所有走動的方法數。 我的border能自定義四角之border-radius : 左上角,右上角,左下角,右下角。 矩陣從左上角向右下角走,每次只能向右或者向下移動,求經過最小的路徑 矩形類中運算符重載C++(定義一個矩形類,數據成員包括左下角和右上角坐標,定義的成員函數包括必要的構造函數、輸入坐標的函數,實現矩形加法,以及計算並輸出矩形面積的函數。) Leetcode練習(Python) :數組類:第62題:一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 問總共有多少條不同的路徑? Leetcode練習(Python):數組類:第63題:一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 現在考慮網格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑? C(n,m)排列組合算法 python實現排列組合公式C(m,n)求值 【組合數學+動態規划】在如下8*6的矩陣中,請計算從A移動到B一共有____種走法。要求每次只能向上或向右移動一格,並且不能經過P。
 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM