백준 #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]보다 숫자가 큰 경우)
#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