https://www.acmicpc.net/problem/11048
11048번: 이동하기
준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는
www.acmicpc.net
문제 설명
NxM 크기의 미로의 각 방에 사탕이 놓여져 있다. 현재 (1, 1)에 있고, (N, M)으로 이동하려고 한다. 오른쪽, 아래쪽, 대각선 아래 오른쪽으로 이동할 수 있고, 각 방을 방문할 때마다 방에 놓여져 있는 사탕을 모두 가져갈 수 있다. (N, M)으로 이동할 때, 가져올 수 있는 사탕 개수의 최댓값을 구한다.
N, M (1 <= N, M <= 1,000)
해결
(1, 1)에서 시작하여 오른쪽, 아래쪽, 대각선 아래 오른쪽으로 이동하며 가장 큰 값을 저장하면 된다.
dp[n][m] = max(dp[n - 1][m], dp[n][m - 1], dp[n - 1][m - 1])
코드
#include<bits/stdc++.h>
#define x first
#define y second
#define INF 1e9
using namespace std;
int n, m;
int board[1005][1005];
int dp[1005][1005];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
cin >> board[i][j];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int MAX = max(dp[i - 1][j], dp[i][j - 1]);
dp[i][j] = max(MAX, dp[i - 1][j - 1]) + board[i][j];
}
}
cout << dp[n][m];
}
'백준' 카테고리의 다른 글
[백준/c++] BOJ 9461 - 파도반 수열 (2) | 2023.12.07 |
---|---|
[백준/c++] BOJ 1003 - 피보나치 함수 (1) | 2023.12.07 |
[백준/c++] BOJ 15988 - 1, 2, 3 더하기 3 (2) | 2023.12.07 |
[백준/c++] BOJ 1912 - 연속합 (1) | 2023.11.30 |
[백준/c++] BOJ 2193 - 이친수 (0) | 2023.11.30 |