본문 바로가기
백준BOJ/동적 계획법

백준 1932 정수 삼각형

by 이일아 2022. 6. 10.
반응형

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

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net

 

 

 

EXPLANATION

        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

삼각형 맨 위에서 부터 바로 양옆에 대각선으로 한칸씩 내려가면서 숫자를 더할 때, 가장 밑에서 구해지는 값들 중 최댓값을 구하는 문제이다.

 

 

예제 입력

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

위와 같이 입력값이 주어지면 아래와 같이 arr[i][j]에 담는다.

i\j 0 1 2 3 4
0 7 0 0 0 0
1 3 8 0 0 0
2 8 1 0 0 0
3 2 7 4 4 0
4 4 5 2 6 5

arr[i][j]를 선언할 때 모두 0으로 초기화시킨 후 입력값을 arr에 담는다.

그러면 입력값이 담아지지 않은 arr[i][j]의 값으 그대로 0이다.

 

dp[i][j]를 따로 선언하지 않고 그냥 arr[i][j]에 dp값들을 갱신하겠다.

그러면

arr[i][j] = max( arr[i][j], arr[i][j - 1]) + arr[i][j]

가 된다. ( 즉, dp[i][j] = max( dp[i][j], dp[i][j - 1]) + arr[i][j] )

 

그런데 예외가 있다. j = 0 이면 arr[i][j - 1]의  값이 없으므로

if(j == 0) arr[i][j] = arr[i-1][0] + arr[i][0];

 

또, i = 0이면 arr[i - 1][j]의 값도 없는데 arr[0][0]은 base이기 때문에 그대로 두면 된다. ( dp[0][0] = arr[0][0] ) 

 

 

위처럼 arr[i][j]를 갱신하면서 맨 밑(i == N - 1) 단계 까지 왔을 때,

arr[N - 1][j]를 dp값으로 갱신시키면서 동시에 이전 최댓값과 비교하고 더 크면 최댓값을 갱신하면서

arr[N - 1][j] 값 들 중에서 최댓값을 찾으면 된다.

 

 

 

i\j 0 1 2 3 4
0 7 0 0 0 0
1 10 15 0 0 0
2 18 16 15 0 0
3 20 25 20 19 0
4 24 30 27 26 24

 

 

 

CODE

#include <iostream>
using namespace std;

int arr[500][500] = {};
int main(){
    int N;
    cin >> N;
    for(int i = 0; i < N; i++){
        for(int j = 0 ; j <= i; j++){
            cin>> arr[i][j];
        }
    }
    
    int maxValue = 0;
    for(int i = 0; i <N ; i++){
        for(int j = 0; j <= i; j++){
            if(i == 0) {}   //i = 0일 때, arr[i][j] 그대로 두면 되니까 애초에 i = 1부터 시작하도록 둬도 된다. 주의할 점은, 그렇게 하면 N = 1일 때 maxValue를 이 for 문 안에서 구현이 안되기 때문에 for문 위에서 maxValue = arr[0][0]로 작성하는 걸 잊으면 안된다.
            else if (j == 0) {
                arr[i][j] = arr[i-1][0] + arr[i][0];
            } else {
                arr[i][j] = max(arr[i-1][j], arr[i-1][j-1]) + arr[i][j];
            }
            if(i == N - 1) maxValue = max(maxValue, arr[i][j]);    //맨 밑 단계오면 최댓값 찾기 
        }
    }
    cout << maxValue << "\n";
}

 

반응형

'백준BOJ > 동적 계획법' 카테고리의 다른 글

백준 1463 1로 만들기  (0) 2022.06.10
백준 2579 계단 오르기  (0) 2022.06.10
백준 1149 RGB거리  (0) 2022.06.09
백준 9461 파도반 수열, 연속합 1912  (0) 2022.06.09
백준 1904 01타일  (0) 2022.06.08

댓글