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?
有道翻译:
一个机器人位于左上角的m x n网格(下图中标记为“开始”)。
机器人任意时候只能向下或者向右移动,机器人尝试到达右下角,求有多少种方法
思路:用动态规划的思考方式去求解,申请额外空间dp[m][n],dp[i][j]表示当以{i,j}为右下角的时候的,机器人移动到该位置的方法,
dp[i][j]的决策方案:
1、机器人从dp[i-1][j]到达{i,j}的位置,也就是从{i-1,j}的位置向下移动到{i,j}
2、机器人从dp[i][j-1]到达{i, j}的位置,也就是从{j,j-1}的位置向右移动到{i, j}
所以dp[i][j] = dp[i-1][j] + dp[i][j-1];
public class Solution {
public int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
dp[0][i] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
return dp[m - 1][n - 1];
}
}
空间优化以后的代码:
public class Solution {
public int uniquePaths(int m, int n){
int[] dp = new int[n];
for (int i = 0; i < n; i++) {
dp[i] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[j] = dp[j - 1] + dp[j];
System.out.println(dp[j]);
}
}
return dp[n - 1];
}
public static void main(String[] args) {
Solution s = new Solution();
int num = s.uniquePaths(2, 62);
System.out.println(num);
}
}