題目描述
給定一個矩陣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