https://www.acmicpc.net/problem/1520
1520번: 내리막 길
여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으
www.acmicpc.net
[ 풀이 ]
dp[i][j]를 (i,j)부터 출발할때 끝점에 도착하는 것의 개수라고 하자.
기저조건은 dp[n-1][m-1]=1이다.
dp[i][j]=∑ 4방향 dp[x][y] 이다.
4방향중 높이조건을 위배하거나 칸을 벗어난다면 제외해주면 된다.
답은 dp[0][0]이 된다.
[ 코드 ]
#include <bits/stdc++.h>
using namespace std;
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
int m, n, h[505][505], dp[505][505];
// 칸에 있는지 여부
int check(int x, int y) {
return (x >= 0 && y >= 0 && x < n&& y < m);
}
// dp[i][j]
int go(int x, int y) {
if (x == n - 1 && y == m - 1) return 1;
int& ret = dp[x][y];
if (ret != -1) return ret;
ret = 0;
// 4방향 합
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (check(nx, ny) && h[nx][ny] < h[x][y]) {
ret += go(nx, ny);
}
}
return ret;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> h[i][j];
}
}
memset(dp, -1, sizeof(dp));
cout << go(0, 0) << '\n';
}
'PS > BOJ' 카테고리의 다른 글
백준 11066 / C++ (0) | 2022.07.21 |
---|---|
백준 6062 / C++ (0) | 2022.07.21 |
백준 9251 / C++ (0) | 2022.07.21 |
백준 10942 / C++ (0) | 2022.07.21 |
백준 13975 / C++ (0) | 2022.07.21 |
댓글