#문제

     7

    3 8

   8 1 0

  2 7 4 4

 4 5 2 6 5

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

입력

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

출력

첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

 

#작성 코드

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int n;
int **tri;
int **triSum;

int main(){
	// 정수 삼각형의 크기 입력 
	scanf("%d", &n);
	// 정수 삼각형 할당 인덱스 1에서부터 사용. i 층에는 i개만큼 배열 할당 
	tri = new int*[n+1];
	for(int i=1; i<=n+1; i++){
		tri[i] = new int[i];
	}
	// 정수 삼각형의 합을 저장할 이차원 배열 할당.
	// triSum[i][j]에는 i층 j번째 원소까지의 합 중 가장 합이 큰 경로의 합 저장 
	triSum = new int*[n+1];
	for(int i=1; i<=n+1; i++){
		triSum[i] = new int[i];
	}
	
	// 정수 삼각형 입력
	for(int i=1; i<=n; i++){
		for(int j=1; j<=i; j++){
			scanf("%d", &tri[i][j]);
		}
	}
	
	// 첫 번째 합 = 첫 번째 원소 
	triSum[1][1] = tri[1][1];
	// 두 번째 층부터 시작 
	for(int i=2; i<=n; i++){
		for(int j=1; j<=i; j++){
			// 해당 층의 첫 원소일 때  
			if( j==1 ){
				triSum[i][j] = triSum[i-1][j]+tri[i][j];
			}
			// 해당 층의 마지막 원소일 때 
			else if( i==j ){
				triSum[i][j] = triSum[i-1][j-1]+tri[i][j];
			}
			// 안쪽에 있는 원소라면 이전 층의 j-1, j번째까지의 triSum 중에서
			// 큰 쪽을 선택하여 이번 층의 원소를 더한다. 
			else{
				triSum[i][j] = max(triSum[i-1][j-1], triSum[i-1][j])+tri[i][j];
			}
		}
	}
	int result=0;
	for(int i=1; i<=n; i++){
		result = max(result, triSum[n][i]);
	}
	printf("%d", result);
	return 0;
} 

##

'BOJ' 카테고리의 다른 글

BOJ 11726번 :: 2xN타일링  (0) 2019.12.01
BOJ 10828번 :: 스택  (0) 2019.12.01
BOJ 1149번 :: RGB거리  (0) 2019.12.01
BOJ 1260번 :: DFS와 BFS  (0) 2019.11.29
BOJ 9461번 :: 파도반 수열  (0) 2019.11.29

+ Recent posts