动态规划:62. 不同路径

62. 不同路径

题目描述:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

解题思路:

动态规划的三个步骤:

1. 定义数组元素的含义;创建一个二维数组sig[m][n]

2. 找出数组之间的关系;

想象以下,机器器⼈人要怎么样才能到达 (i, j) 这个位置?由于机器人可以向下⾛走或者向右⾛走,所以有两种⽅式到达;

一种是从 (i-1, j) 这个位置⾛走⼀一步到达;一种是从(i, j - 1) 这个位置走⼀步到达;

因为是计算所有可能的步骤,所以是把所有可能⾛走的路路径都加起来,所以关系式是 dp[i] [j] = dp[i-1] [j]+ dp[i] [j-1]

3. 找出初始值;

dp[0] [0….n-1] = 1; // 相当于最上⾯面⼀⾏行,机器器人只能一直往左⾛;
dp[0…m-1] [0] = 1; // 相当于最左⾯面⼀列列,机器器人只能一直往下⾛。

 

 1 class Solution {
 2 public:
 3     int uniquePaths(int m, int n) 
 4     {
 5         //int sig[m][n];
 6         /*  动态创建一个二维数组,考虑内存释放,否则会泄露*/
 7         int** sig=new int* [m];
 8         for(int i=0;i<m;i++)
 9         {
10             sig[i]=new int[n];
11         }
12 
13         for (int i=0; i<m; i++)
14         {
15             sig[i][0]=1;
16         }
17         for (int i=0; i<n; i++)
18         {
19             sig[0][i]=1;
20         }
21 
22         for (int i=1; i<m; i++)
23             for (int j=1; j<n; j++)
24             {
25                 sig[i][j] = sig[i-1][j] + sig[i][j-1];
26             }
27         return sig[m-1][n-1];
28     }
29 };

猜你喜欢

转载自www.cnblogs.com/Tavi/p/12555885.html
今日推荐