1. 程式人生 > >網格從左下角移動到右上角有多少種路線(動態規劃)

網格從左下角移動到右上角有多少種路線(動態規劃)

在面試中遇到的一個問題,螞蟻從(m,n)的網格一角爬到對角(不能往回爬),查了一些東西,自己寫下自己的一些理解,望大神指點。

從網格的一角爬到對角,有多少中爬法。 理解部分: 將其進行轉換,轉換為從(m,n)座標到(0,0)座標有多少種移動方法。(只能下移,左移) 。 。 。 。 。 。 。 。 。 。 。 。 1 3 6 10 。 。 1 2 3 4 。 。 0 1 1 1 。 。 如上圖所示,將(m,n)點到(0,0)的路線進行一系列的細分, (i,j)為點的位置。起始位置為(m,n)。 (m,n)= (m,n-1)+(m-1,n);有兩種走法。 (m,n-1) = (m,n-2)+(m-1,n-1);即(m,n-1)點接下來有兩種走法,同理(m-1,n) = (m-1,n-1)+(m-2,n); 。。。。 當(i,j)中的i=0,或者j=0時,接下來只能進行右移,或者上移,即此時只有一種走法。 即m=0,或者n=0,則只有一種走法,return 1; 程式碼如下: public class GridCrawl { public static int crawl(int m,int n){ if (m > 0 && n > 0)//該座標可以下移或者左移 { return crawl(m, n - 1) + crawl(m - 1, n); } else if ((m == 0) && (n > 0))//只可以下移 { return crawl(m,n-1); } else if ((n == 0) && (m > 0))//只可以左移 { return crawl(m-1,n); } else if ((m == 1 && n == 0) || (m == 0 && n == 1)) { return 1; } else return 0; } } 簡化寫法 public static int crawl(int m,int n){ if(m == 0 && n == 0) return 0; if(m == 0 || n == 0) return 1; return crawl(m-1,n)+crawl(m,n-1); }