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