Algorithm/BOJ

[BOJ]11048 - 이동하기 (C++)

꾸지새미언니 2022. 1. 5. 15:17

문제

https://www.acmicpc.net/problem/11048

코드

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int dp[1001][1001];
int arr[1001][1001];

int main(){
    cin.tie(0); cout.tie(0);
    ios_base::sync_with_stdio(false);

    int n, m; 
    cin >> n >> m; 

    for(int i=1; i<=n;i++){
        for(int j=1; j<=m; j++){
            cin >> arr[i][j]; 
        }
    }

    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            int rUp, cUp, rcUp; 

            cUp = dp[i-1][j];

            rUp = dp[i][j-1]; 

            rcUp = dp[i-1][j-1]; 

            dp[i][j] = arr[i][j] + max({cUp, rUp, rcUp});
        }
    }
    cout << dp[n][m];
}

풀이

준규는 (r+1, c), (r, c+1), (r+1, c+1) 중 최대로 이동해야 한다.
이 전에 계산 했던 결과를 dp[]에 담고 위의 3개의 좌표 중 최댓값으로 이동해서 dp의 값을 바꾼다.
for문이 i=1~n인 이유는 준규가 (1,1)에서 시작하기 때문이다.
아이디어를 생각해 내면 꽤 쉽게 풀 수 있는 문제였다.