給定一個矩陣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)(上方)的和,用遞歸的思想可以做出


int way(int i,int j){
	if (i == 0 )//位於某一行,只有j種方法
		return j;
	else if (j == 0)//位於某一列,有i種方法
		return i;
	return way(nums, i - 1, j) + way(nums, i, j - 1);
}

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

int uniquePaths(int m, int n)
{
	int N = n + m - 2;
	int K = n - 1;
	double res = 1.0;
	for (int i = 1; i <= n - 1; ++i)
	{
		res = res * (N - K + i) / i;
	}
	return (int)res;
}

轉載:https://blog.csdn.net/liugg2016/article/details/82150122

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章