문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/43105
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
코드 구현
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> triangle)
{
int n = triangle.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
// dp 테이블 맨 아랫쪽 초기화
for (int i = 0; i < n; ++i)
{
dp[n - 1][i] = triangle[n - 1][i];
}
// 아래부터 올라가면서 dp 테이블 채우기
for (int i = n - 2; i >= 0; --i)
{
for (int j = 0; j <= i; ++j)
{
dp[i][j] = triangle[i][j] + max(dp[i + 1][j], dp[i + 1][j + 1]);
}
}
return dp[0][0];
}
해결 방법
- 거쳐간 숫자의 최댓값을 구하는 문제이기 때문에 아래에서 위로 올라가면서 가장 위의 [0][0] 값이 최댓값이 되도록 유도
- 삼각형의 i, j 위치까지 거쳐간 숫자의 합 중 최댓값을 dp[i][j]라고 하고 삼각형의 구성 요소의 값을 triangle[i][j]라고 했을 때, dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + triangle[i][j]가 된다.
- 아래에서 위로 올라가므로 결국 i, j = (0, 0)이 될 것이고 dp[0][0]이 곧 최댓값
'개발 > 알고리즘' 카테고리의 다른 글
[백준] 9663번: N-Queen(C++) (1) | 2025.05.31 |
---|---|
[프로그래머스] 단어 변환(C++) (1) | 2025.05.26 |
[백준] 7576번: 토마토(C++) (1) | 2025.05.24 |
[백준] 1967번: 트리의 지름(C++) (1) | 2025.05.16 |
[프로그래머스] 가장 먼 노드(C++) (1) | 2025.05.15 |