※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25713번 문제인 괴도 인하이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25713
25713번: 괴도 인하
괴도 인하는 인하대학교의 수많은 동아리들이 두려워하는 악명 높은 도둑이다. 그는 동아리방에 남겨진 값비싼 물건들을 아무도 모르게 훔쳐 간다. 특이하게도 범행 전 늘 예고장을 보내지만,
www.acmicpc.net
게임기에 도달할 때까지의 괴도 인하의 움직임은 오른쪽 움직임과 아래쪽 움직임으로 구성되어있다는 점을 눈여겨보자.
한 경로가 특정 카메라가 비추는 경로를 지나간다면, 해당 경로는 카메라가 비추는 범위의 가장 위쪽 칸 또는 가장 왼쪽 칸을 무조건 지나게 된다는 점을 확인하자. 이 점과 (r,c)까지 도달하는 모든 경로는 (r-1,c)를 거쳐왔거나 (r,c-1)을 거쳐올 수밖에 없다는 점을 이용하면 점화식을 간단히 세워 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int R, C, K;
int dp[1001][1001];
int rowmove[1001][1001], colmove[1001][1001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C >> K;
while (K--) {
int r1, c1, r2, c2; cin >> r1 >> c1 >> r2 >> c2;
for (int r = r1; r <= r2; r++) {
rowmove[r][c1]++;
}
for (int c = c1; c <= c2; c++) {
colmove[r1][c]++;
}
}
dp[1][1] = colmove[1][1];
for (int r = 2; r <= R; r++) dp[r][1] = dp[r - 1][1] + colmove[r][1];
for (int c = 2; c <= C; c++) dp[1][c] = dp[1][c - 1] + rowmove[1][c];
for (int r = 2; r <= R; r++) {
for (int c = 2; c <= C; c++) {
dp[r][c] = min(dp[r - 1][c] + colmove[r][c], dp[r][c - 1] + rowmove[r][c]);
}
}
cout << dp[R][C];
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 25314 // C++] 코딩은 체육과목 입니다 (0) | 2022.10.19 |
---|---|
[BOJ 25501 // C++] 재귀의 귀재 (0) | 2022.10.18 |
[BOJ 25595 // C++] 86 ─에이티식스─ 2 (0) | 2022.10.16 |
[BOJ 25594 // C++] HG 음성기호 (1) | 2022.10.15 |
[BOJ 25593 // C++] 근무 지옥에 빠진 푸앙이 (Small) (0) | 2022.10.14 |