반응형
문제
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
입력
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
출력
첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.
예제 입력 1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
예제 출력 1
30
풀이
매우 간단한 DP문제이다. 위에서부터 쭉 계산해서 결과를 저장해 나가는 방식이다.
계산 방식은 그냥 이전줄 계산 결과에 더하기만 하면 되는 것!
좌표가 좀 헷갈려서 주황색으로 써두고 풀이했당.
#include <iostream>
#include <cstdio>
int map[500][500];
int result[500][500];
int main(void){
int n;
int temp1, temp2;
int max = 0;
scanf("%d", &n);
for(int i=0; i<n; i++){
for(int j=0; j<i+1; j++){
scanf("%d", &map[i][j]);
}
}
result[0][0] = map[0][0];
for(int i=1; i<n; i++){
for(int j=0; j<i+1; j++){
if(j==0)
result[i][j] = result[i-1][j] + map[i][j];
else if(j == i)
result[i][j] = result[i-1][j-1]+map[i][j];
else{
temp1 = result[i-1][j-1] + map[i][j];
temp2 = result[i-1][j] + map[i][j];
if(temp1 > temp2)
result[i][j] = temp1;
else
result[i][j] = temp2;
}
}
}
max = result[n-1][0];
for(int i=1; i<n; i++){
if(max < result[n-1][i])
max = result[n-1][i];
}
printf("%d\n", max);
}
728x90
반응형
'알고리즘 > PS - 백준' 카테고리의 다른 글
[백준 1516 - C++] 게임 개발 : DP + DFS (0) | 2021.05.03 |
---|---|
[백준 9465 - C++] 스티커 : DP (0) | 2021.04.30 |
[백준 1699 - C++] 제곱수의 합 : DP (0) | 2021.04.30 |
[백준 9095 - C++] 1, 2, 3 더하기 : DP (0) | 2021.04.30 |
[백준 2146 - C++] 다리 만들기 : BFS (0) | 2021.04.13 |