본문 바로가기

백준

[백준/c++] BOJ 11048 - 이동하기

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];
}