标签:星星 Paths Right 格子 int 路线 62 Unique dp
原题链接: https://leetcode.com/problems/unique-paths/
1. 题目介绍
A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
How many possible unique paths are there?
Note: m and n will be at most 100.
有一个长为m, 宽为n的格子区域。n和m最大是100。
这个格子区域左上角有一个机器人,右下角有一个星星。机器人只能向右或者向下走,问机器人到达星星的不同路线有多少条?
Example 1:
Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right
Example 2:
Input: m = 7, n = 3
Output: 28
2. 解题思路-动态规划
这个题是一个非常好的、用于理解和练习动态规划的题目。
观察这个格子区域,首先可以发现,星星上面和左面的格子到星星的路线只有1条。我们将路线数目存放在格子里,如下图所示:
在星星左上角的格子,它想要走到星星,必须到达星星上面的格子或者左面的格子,因此它到达星星的路线数就是右边格子的值+下面格子的值。1+1=2.
我们可以发现,由于机器人每一步只能向右或者向下走,因此某个位置到达星星的路线数,就是下面格子的路线数+右面格子的路线数。如果右边没有格子了,那就只加下边格子;如果下边没有格子了,那就只加右边格子。
每一个格子的值,都是右边格子和下边格子的和。下图是Example2 的求解过程。
因此,我们只需要构造一个二维的数组,采用倒序的遍历方式就可以得到可能的路线总数。倒序的遍历方式是指:在同一行中,从右向左遍历;在同一列中,自下向上遍历。
动态规划的精髓就在于利用前一步的计算结果去计算当前的值。本题的状态转移方程为:
dp[i][j]=dp[i][j+1]+dp[i+1][j]
在具体实现时,星星上边和左边的两个位置需要赋初值1,然后其他的位置都由他们递推计算而来。
实现代码
class Solution {
public int uniquePaths(int m, int n) {
if(m==1 || n ==1) {
return 1;
}
int[][] dp = new int[m+1][n+1];
dp[m-1][n-2] = 1;
dp[m-2][n-1] = 1;
for(int i = m-1 ; i>=0 ; i--) {
for(int j = n-1 ; j>=0 ; j--) {
if(dp[i][j] != 0) {
continue;
}
dp[i][j] = dp[i][j+1] + dp[i+1][j];
}
}
return dp[0][0];
}
}
标签:星星,Paths,Right,格子,int,路线,62,Unique,dp 来源: https://blog.csdn.net/Bertram03/article/details/87884498
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。