[BOJ 1932] 정수 삼각형

Leehyemin·2023년 3월 12일
0

알고리즘_백준

목록 보기
5/7
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N =0;
int res[501][501]={-1,};
//1932 정수삼각형
//Created by polcomicepute

// 재귀로 풀수있는 방법 있을까?
// 트리 모양이라 많이 헷갈렸음 .. 계단 적용 생각 

void func(int n, int j, int *tri[501]){
    if (n==0){ // Root 노드는 자기 자신 그대로
        res[n][j] = tri[n][j]; 
    }
    else if ((n < N) && (n>0)){ // 삼각형 내
        if ((j>0) && (j <= (n-1))){ 
            // 2가지 갈래로부터 올 수 있는 노드는 max 선택
            if ((res[n-1][j-1]+ tri[n][j]) < (res[n-1][j]+ tri[n][j])){
                res[n][j] = res[n-1][j]+ tri[n][j];
            }
            else{
                res[n][j] = res[n-1][j-1]+ tri[n][j];
            }
        }
        else if (j==0){ //끄트머리는 이전 노드
            res[n][j] = res[n-1][j]+ tri[n][j];
        }
        else if (j==n){ //끄트머리는 이전 노드
            res[n][j] = res[n-1][j-1]+ tri[n][j];
        } 
       
    }
    else{ // 외에는 out
        return;
    }
    
}

int main(){
    cin >> N;
    vector <int> v;

    // 2차원 배열 입력받기
    int** tri = new int*[N+1];
    for (int i = 0; i < N; i++) {
        tri[i] = new int[N+1];  
        fill_n(tri[i], N, 0);
        for (int j = 0; j <= i; j++) { 
            cin >> tri[i][j]; 
        }
    } 

    // 합 구하기
    for (int i = 0; i <= N-1; i++) {
        for (int j = 0; j <= i; j++) { 
             
            func(i,j,tri);
            
        }
      
    }

    // 마지막 노드 중, max 값
    int max = -1;
    for (int j = 0; j < N; j++) { 
   
        if (max < res[N-1][j]) max=res[N-1][j];
        // cout << res[N-1][j] << endl;

        
    }
    cout << max << endl;

 

    return 0;
}

0개의 댓글