解法1(排列组合)
公式:
C
x
+
y
−
2
x
−
1
C_{x+y-2}^{x-1}
Cx+y−2x−1或
C
x
+
y
−
2
y
−
1
C_{x+y-2}^{y-1}
Cx+y−2y−1
注意点:
- x和y是方格的格点数
- 机器人走的是格点
public class Robot {
public int countWays(int x, int y) {
// write code here
int n = x + y - 2;
int t = x > y ? y - 1: x - 1;
int num1 = 1;
int num2 = 1;
for (int i = 0; i < t; i++) {
num1 *= (n - i);
num2 *= (1 + i);
}
return num1/num2;
}
}
解法2 (动态规划)
- 算出递推式:F(x, y) = F(x - 1, y) + F(x, y - 1)
public class Robot {
public int countWays(int x, int y) {
int[][] dp = new int[x + 1][y + 1];
// 初始化dp
for (int i = 1; i <= x; i++) {
dp[i][1] = 1;
}
for (int i = 1; i < dp[0].length; i++) {
dp[1][i] = 1;
}
for (int i = 2; i <= x; i++) {
for (int j = 2; j <= y; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[x][y];
}
}