문제: 백준 1932 (c++)

Image

Image

풀이과정


문제에 나온 삼각형을 조건에 맞게 보면 아래층은 위층의 대각선 왼쪽 또는 대각선 오른쪽 숫자를 선택할 수 있는데,

배열로 생각하여 정리해 보면, 현재가 i 층일 때 dp[i-1][j] 또는 dp[i-1][j-1]의 숫자를 선택할 수 있다는 것이다.

이 문제는 최댓값을 구하는 문제이기에 제일 위 쪽의 두 개의 층은 직접 dp를 더하여 최종 dp 배열의 값을 지정해 주고

그 이후부터는 최댓값을 최종 dp 배열에 넣어주면 되는데


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

그냥 이렇게 할 경우 양 끝의 배열들은 오직 dp[i - 1][j] 이 숫자나 dp[i - 1][j - 1] 이 숫자를 선택해야 하는

예외가 생기기에 if-else 문으로 예외 처리를 해주어야 한다.

#include <iostream>
#include <algorithm>
using namespace std ;

int main(){

    int n ;
    cin >> n ;

    int dp[501][501] ;
    int res = 0 ;

    for(int i = 0; i < n; i++){
        for(int j = 0; j <= i; j++){
            cin >> dp[i][j] ;
        }
    }

    dp[1][0] += dp[0][0] ; 
    dp[1][1] += dp[0][0] ;

    for(int i = 2; i < n; i++){
        for(int j = 0; j <= i; j++){

            if(j == 0) dp[i][j] += dp[i-1][j] ;
            else if(j == i) dp[i][j] += dp[i-1][j-1] ;
            else dp[i][j] += max(dp[i-1][j], dp[i-1][j-1]) ;
        }
    }

    for(int i = 0; i < n; i++){
        res = max(res, dp[n-1][i]) ;
    }
    cout << res ;
    
}



Image

Tags:

Categories:

Updated:

Leave a comment