🔗 문제 링크 : https://www.acmicpc.net/problem/1932
문제
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
입출력 예시
풀이
#include <iostream>
#include <algorithm>
using namespace std;
int triangle[505][505];
int dp[505][505];
int main() {
int answer = 0;
int n; // 삼각형의 크기
//. 삼각형의 크기 입력받기
cin >> n;
//. 배열에 정수 삼각형 입력받기
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i + 1; ++j) {
cin >> triangle[i][j];
}
}
//. DP
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i + 1; ++j) {
if (i == 0 && j == 0)
dp[i][j] = triangle[i][j];
dp[i][j] = max(dp[i][j], triangle[i][j] + dp[i - 1][j]);
if (j != 0)
dp[i][j] = max(dp[i][j], triangle[i][j] + dp[i - 1][j - 1]);
}
}
for (int i = 0; i < n; ++i) {
answer = max(dp[n - 1][i], answer);
}
cout << answer;
return 0;
}
- triangle 배열 : 정수 삼각형을 입력받아서, triangle[0][0]부터 차례대로 저장
- dp 배열 : 아래층으로 내려오면서 선택된 수들의 합 (기존 값이랑 새로 들어온 값을 비교해서 큰 값을 저장하도록 함)
'🐸 Problem Solving > BOJ' 카테고리의 다른 글
[BOJ/C++] 백준 2747번: 피보나치 수 (0) | 2024.07.30 |
---|---|
[BOJ/C++] 백준 2748번: 피보나치 수 2 (0) | 2024.07.29 |
[BOJ/C++] 백준 9471번: 피사노 주기 (0) | 2024.07.29 |