バイトの競プロメモ

主に競技プログラミング

D - 経路  AtCoder Beginner Contest 037

問題概略
H*Wのマス目がある。好きなマスから好きなだけ自分より大きいマスへ隣に動ける。
移動経路の個数の余りを求めよ。

制約
HW <=1000

解法
自分より大きいところへしか進めないため、閉路はない。
よって経路の数をマスごとにメモできる。
dpに-1を入れておき、移動できるマスの数+1を返すようにすれば動く

public static void solve() throws Exception {
        //longを忘れるなオーバーフローするぞ
        H = ni();
        W = ni();
        long res = 0;
        dp = new long[H][W];
        a = nlt(H, W);
        fill(dp, -1);
        for (int hiq = 0; hiq < H; hiq++) {
            for (int wi = 0; wi < W; wi++) {
                res = modSum(res, dfs(hiq, wi));
            }
        }
        System.out.println(res);
    }

    static long[][] dp;

    public static long dfs(int h, int w) {
        if (dp[h][w] >= 0) return dp[h][w] + 1;
        dp[h][w] = 0;
        for (int i = 0; i < 4; i++) {
            int nh = h + y4[i];
            int nw = w + x4[i];
            if (isOutofIndex(nh, nw, H, W)) continue;
            if (a[h][w] >= a[nh][nw]) continue;
            dp[h][w] = modSum(dp[h][w], dfs(nh, nw));
        }
        return dp[h][w] + 1;
    }