- 문제 링크 : boj.kr/26259
- 난이도 : G4
- 태그 : DP
26259번: 백룸
은소마는 현재 알 수 없는 방에 갇혀 있다. 각 방에는 한 개의 수가 적혀 있고, 아래쪽, 오른쪽으로 향하는 문만 열려, 그 방향으로만 갈 수 있다고 한다. 그런데, 중간에 큰 벽 한 개가 가로막고
www.acmicpc.net
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int board[1000][1000];
int X1, Y1, X2, Y2;
bool check(int x, int y, int dir) {
if(dir == 0) {
return ((X1 == X2 && X1 == x) &&
(Y1 <= y && y < Y2));
}
if(dir == 1) {
return ((Y1 == Y2 && Y1 == y) &&
(X1 <= x && x < X2));
}
return false;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cin >> board[i][j];
}
}
cin >> X1 >> Y1 >> X2 >> Y2;
if(X1 > X2) swap(X1, X2);
if(Y1 > Y2) swap(Y1, Y2);
vector<vector<int>> dp(n, vector<int>(m, -INF));
dp[0][0] = board[0][0];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(dp[i][j] == -INF) continue;
if(i+1 < n && !check(i+1, j, 0)) {
dp[i+1][j] = max(dp[i+1][j], dp[i][j] + board[i+1][j]);
}
if(j+1 < m && !check(i, j+1, 1)) {
dp[i][j+1] = max(dp[i][j+1], dp[i][j] + board[i][j+1]);
}
}
}
if(dp[n-1][m-1] == -INF) cout << "Entity";
else cout << dp[n-1][m-1];
return 0;
}
풀이
2차원 DP 문제이다.
간단하게 식을 세워보면,
$$DP[i][j] = max(DP[i-1][j], DP[i][j-1]) + board[i][j]$$
라고 할 수 있다.
하지만 위의 식은 도착하는 방을 기준으로 세워져 있기 때문에, 벽을 처리하는 것이 까다로워진다.
문제를 도착하는 방을 기준으로 해결하지 않고, 출발하는 방을 기준으로 해결하면 처리가 간단해진다.
728x90
'PS' 카테고리의 다른 글
BOJ 9575 : 행운의 수 (1) | 2024.02.08 |
---|---|
BOJ 25344 : 행성 정렬 (2) | 2024.02.07 |
BOJ 2667 : 단지번호붙이기 (0) | 2024.02.05 |
BOJ 20921 : 그렇고 그런 사이 (1) | 2024.02.04 |
BOJ 4307 : 개미 (0) | 2024.02.03 |