題目要求
分析
我的思路很簡單,因爲這個題所有的點都是開始的,所以直接把數組多開一個邊,開一個[n+1][n+1]的數組就行了。
初始化,先把右邊界和上邊界的所有值初始化完成,因爲它們的值只有一個來源。
之後就遍歷所有的點位,按照遞推式來求解即可。
注意的是怎麼表示不可過的點呢?我選擇直接在矩陣裏賦值其爲,掃到就把當前值改爲,這個代表的可是真正的而不是初始化的。
這個題的輸入數據特點:
- 總量不大
- 行數多(也不是特別多)
- 每行值很少
所以Scanner很合適,選就對了。
注意要,在每一次求和之後就行了,因爲兩數相加位數不可能大幅躍升,所以也不需要擔心爆。
AC代碼(Java語言描述)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(), m = scanner.nextInt();
int[][] nums = new int[n+1][n+1];
for (int i = 0; i < m; i++) {
nums[scanner.nextInt()][scanner.nextInt()] = -1;
}
scanner.close();
nums[1][1] = 1;
for (int i = 2; i <= n; i++) {
if (nums[1][i] == -1) {
nums[1][i] = 0;
} else {
nums[1][i] = nums[1][i-1];
}
if (nums[i][1] == -1) {
nums[i][1] = 0;
} else {
nums[i][1] = nums[i-1][1];
}
}
for (int i = 2; i <= n; i++) {
for (int j = 2; j <= n; j++) {
if (nums[i][j] == -1) {
nums[i][j] = 0;
} else {
nums[i][j] = (nums[i-1][j] + nums[i][j-1]) % 100003;
}
}
}
System.out.println(nums[n][n]);
}
}