끄적끄적 코딩
article thumbnail

다이나믹 프로그래밍 문제입니다.

 

피라미드모양에 각각 값들이 들어가있습니다.

위에서부터 왼쪽이나 오른쪽을 통해 내려올 때

합이 최대가 되는 경로의 값을 찾는 문제입니다.

 

경우의 수는

 

1. 위치가 가장자리일 때

2. 위치가 중앙일 때

 

2가지가 있습니다.

 

1번의 경우 바로 위의 값을 더해서 DP에 넣어주고

2번의 경우 바로 위의 값이 더할 수 있는 두개의 수를 비교해서 큰값을 더해서 DP에 저장합니다.

 

#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
    int n;
    int value = 0;
    int arr[510][510];
    cin >> n;
    for(int i=0; i<n; ++i){
        for(int j=0; j<=i; ++j){
            cin >> arr[i][j];
        }
    }
    for(int i=1; i<n; ++i){
        for(int j=0; j<=i; ++j){
            if(j==0){
                arr[i][j] += arr[i-1][j];
            }
            else if(j==i){
                arr[i][j] += arr[i-1][j-1];
            }
            else{
                arr[i][j] += max(arr[i-1][j], arr[i-1][j-1]);
            }
        }
    }
    for(int i=0; i<n; ++i){
        if(value < arr[n-1][i]){
            value = arr[n-1][i];
        }
    } 
    cout << value;
    return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 2156번 포도주 시식  (0) 2019.05.17
[C++] 백준 1003번 피보나치 함수  (0) 2019.05.17
[C++] 백준 2193번 이친수  (0) 2019.05.17
[C++] 백준 1149번 RGB거리  (0) 2019.05.09
[C++] 백준 2447번 별 찍기 - 10  (4) 2019.05.07

검색 태그