백준 #1520 내리막 길

1 minute read

백준 #1520 내리막 길

인접한 칸에 더 작은 수가 있을 때만 진행할 수 있는 문제. DP로 풀 수 있다.

dp[x][y] = (x, y)로 갈 수 있는 경로의 개수

= dp[x – 1][y] + dp[x + 1][y] + dp[x][y – 1] + dp[x][y + 1] (단, dp[x][y]보다 숫자가 큰 경우)

3
3
5
5
1%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%225%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22465%22%20y%3D%22365%22%20width%3D%2240%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
1%3Cmx...
7
7
7
7
큰 쪽에서 작은 쪽으로만 이동할 수 있으니,
인접 칸의 숫자가 클 경우에만 경우의 수를 더해준다.
큰 쪽에서 작은 쪽으로만 이동할 수 있으니,...
Viewer does not support full SVG 1.1
#include <iostream>
#include <cstring>
#include <bits/stdc++.h>

using namespace std;

int M, N;
int board[500][500];
int dp[500][500];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};

bool isInBoard(int x, int y) {
    return x >= 0 && x < M && y >= 0 && y < N;
}


int calc(int x, int y) {
    if(dp[x][y] != -1) {
        return dp[x][y];
    }
    dp[x][y] = 0;
    for(int i = 0; i < 4; i++) {
        int nX = x + dx[i];
        int nY = y + dy[i];
        if(isInBoard(nX, nY) && board[nX][nY] > board[x][y]) {
            dp[x][y] += calc(nX, nY);
        }
    }
    return dp[x][y];
}


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> M >> N;
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < N; j++) {
            cin >> board[i][j];
        }
    }
    memset(dp, -1, sizeof(dp));
    dp[0][0] = 1;
    int a, b;
    cout << calc(M - 1, N - 1);
    return 0;
}

Comments