Algorithm/Problem Solve

[백준 1932번] 정수삼각형(C++)

아네스 2021. 1. 8. 17:44
반응형

아이디어 

일단 dp인건 알것이고, 1,2,3으로 3가지 경우의수로 나눠서 풀었다.

1. 가장 왼쪽 노드 = 이전 층의 가장 왼쪽 노드 dp값 + 가장왼쪽 노드의 board값

2. 중간에 껴있는 노드 = max(자신이 받을 수 있는 이전 층 노드dp값) + 자신의 노드 board값

3. 가장 오른쪽 노드 = 이전층의 가장 오른쪽 노드 dp값 + 자신의 노드 board값

C++풀이

#include <bits/stdc++.h>

using namespace std;
int board[501][501];
int dp[501][501];
int N;

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N;
    for(int i = 0 ; i< N; i++)
    {
        for(int j = 0 ; j<i+1; j++)
        {
            int tmp;
            cin >> tmp;
            board[i][j] = tmp;
        }
    }
    dp[0][0] = board[0][0];
    for(int i = 1 ; i< N; i++)
    {
        for(int j = 0 ; j< i+1; j++)
        {
            if(j ==0){
                dp[i][0] = dp[i-1][0]+ board[i][j];
            }
            else if ( j>0 && j <i)
            {
                dp[i][j] = max(dp[i-1][j-1],dp[i-1][j])+board[i][j];
            }
            else if (j == i)
            {
                dp[i][j] = dp[i-1][j-1] + board[i][j];
            }
        }
    }
    int result = INT_MIN;
    for(int i =0; i< N; i++)
    {
        result = max(result, dp[N-1][i]);
    }
    cout << result;
}
반응형