赞
踩
题目描述
给定一个矩阵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网格
因为只有一个网格,直接数就能数出路线数量,但是我们可以发现几条规律:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。