路徑計數2(洛谷P1176題題解,Java語言描述)

題目要求

題目鏈接

在這裏插入圖片描述

分析

我的思路很簡單,因爲這個題所有的點都是(1,1)(1,1)開始的,所以直接把數組多開一個邊,開一個[n+1][n+1]的數組就行了。

初始化f[1][1]=1f[1][1]=1,先把右邊界和上邊界的所有值初始化完成,因爲它們的值只有一個來源。

之後就遍歷所有的點位,按照遞推式f[i][j]=f[i1][j]+f[i][j1]f[i][j] = f[i-1][j] + f[i][j-1]來求解即可。

注意的是怎麼表示不可過的點呢?我選擇直接在矩陣裏賦值其爲1-1,掃到1-1就把當前值改爲00,這個00代表的可是真正的00而不是初始化的00

這個題的輸入數據特點:

  • 總量不大
  • 行數多(也不是特別多)
  • 每行值很少

所以Scanner很合適,選就對了。

注意要mod100003mod100003,在每一次求和之後就行了,因爲兩數相加位數不可能大幅躍升,所以也不需要擔心爆intint

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]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章