BOJ

백준 1932 - 정수 삼각형

yanJuicy 2020. 2. 28. 18:14
반응형

문제

 

https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

문제 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. 삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는

www.acmicpc.net

 

 

풀이

 

n번째 줄까지 값을 더했을 때 최대값을 찾아야하는 문제이다. i번째 줄에서 선택할 수 있는 숫자는 i-1번째에 있는 숫자들 중 대각선으로 연결된 두 숫자들이다. 이 두 숫자들 중에 최대를 골라서 더하면 i번째 줄까지 삼각형의 숫자들은 최대로 이루어지게 된다. 이 과정을 n번째 줄까지 반복을 하면 n번째 줄에는 최대값 경로로만 더해진 숫자들이 n개가 모이게 된다. 이 n개의 숫자중에서 최대를 고르면 n번째 경로까직 가는 최대 경로 값을 구할 수 있다.

 

 

코드

 

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int dp[501][502];
int n;
int result;
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> n;
 
    for (int i=1; i<=n; i++)
        for (int j=1; j<=i; j++)
            cin >> dp[i][j];
 
    for (int i=2; i<=n; i++)
        for (int j=1; j<=i; j++)
            dp[i][j] += max(dp[i-1][j], dp[i-1][j-1]);
        
    for (int i=1; i<=n; i++)
        result = max(result, dp[n][i]);
 
    cout << result;
 
    return 0;
}
cs

 

python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
= int(input())
 
= [[0* n for _ in range(n)]
data = []
for _ in range(n):
    data.append(list(map(int, input().split())))
 
d[0][0= data[0][0]
for i in range(1, n):
    for j in range(len(data[i])):
        if j == 0:
            d[i][j] += d[i-1][j] + data[i][j]
        elif j == len(d[i]) - 1:
            d[i][j] += d[i-1][j-1+ data[i][j]
        else:
            d[i][j] += max(d[i-1][j-1], d[i-1][j]) + data[i][j]
 
print(max(d[n-1]))
cs

 

 

반응형

'BOJ' 카테고리의 다른 글

백준 11048 - 이동하기  (0) 2020.03.04
백준 9935 - 문자열 폭발  (0) 2020.03.03
백준 1874 - 스택 수열  (0) 2020.02.24
백준 2004 - 조합 0의 개수  (0) 2020.02.18
백준 6588 - 골드바흐의 추측  (0) 2020.02.12