티스토리 뷰

 

문제 링크 : https://www.acmicpc.net/problem/2169

 

2169번: 로봇 조종하기

첫째 줄에 N, M(1≤N, M≤1,000)이 주어진다. 다음 N개의 줄에는 M개의 수로 배열이 주어진다. 배열의 각 수는 절댓값이 100을 넘지 않는 정수이다. 이 값은 그 지역의 가치를 나타낸다.

www.acmicpc.net

 

1. dp 의 정의

좌표 ( i , j ) 에 진입하는 방식에 따라 다음 움직임이 제한된다. 즉, 진입 방향을 기록할 필요가 있다.

dir 은 진입 방향을 나타내는데 사용한다. (1, 1) 이 좌측 상단을 위미한다고 할 때,

dir=1 은 위에서 아래로, dir=0 은 오른쪽에서, dir=2는 왼쪽에서 진입을 나타낸다.

dp[i][j][dir]은 ( 1, 1 ) 에서 이동하여 dir 방향으로 ( i , j ) 로 진입했을 때, 얻을 수 있는 가치의 최댓값으로 정의한다.

 

2. 기저 사례 처리

가치의 최댓값을 구하기 위해 max 함수를 사용함을 상기하자.

따라서 발생할 수 없는 사례에 대해서는 dp 값을 엄청 작은 값으로 초기화한다.

 

#include<bits/stdc++.h>

using namespace std;
const int Inf=1e9+7;

int arr[1001][1001], dp[1001][1001][3];

int main(){
    int n,m; scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) for(int j=0;j<m;j++)
        scanf("%d",&arr[i][j]);
    
    dp[0][0][1]=arr[0][0];
    dp[0][0][0]=-Inf;
    dp[0][0][2]=-Inf;
    for(int i=1;i<m;i++) {
        dp[0][i][2]=max(dp[0][i-1][1],dp[0][i-1][2])+arr[0][i];
        dp[0][i][0]=dp[0][i][1]=-Inf;
    }

    for(int i=1;i<n;i++){
        for(int j=0;j<m;j++)
            dp[i][j][1]=arr[i][j]+max(dp[i-1][j][0], 
                                      max(dp[i-1][j][1],dp[i-1][j][2]));
        
        dp[i][0][2]=-Inf;
        for(int j=1;j<m;j++)
            dp[i][j][2]=arr[i][j]+max(dp[i][j-1][2],dp[i][j-1][1]);
        
        dp[i][m-1][0]=-Inf;
        for(int j=m-2;j>=0;j--)
            dp[i][j][0]=arr[i][j]+max(dp[i][j+1][0],dp[i][j+1][1]);
    }
    
    int ans=-Inf;
    for(int i=1;i<3;i++)
        ans=max(ans, dp[n-1][m-1][i]);
    printf("%d\n", ans);
}

 

 

반응형

'DS\Algo > Dynamic Programming' 카테고리의 다른 글

BOJ 2240 자두나무  (0) 2022.10.19
BOJ 15990 1, 2, 3 더하기 5  (0) 2022.09.27
BOJ 17626 Four Squares  (0) 2022.09.26
BOJ 7579 앱  (1) 2022.09.25
BOJ 2011 암호코드(Alphacode)  (1) 2022.09.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함