반응형
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/43105
문제 풀이
간단한 DP 문제이다.
그림에서는 삼각형이지만 실제 배열로 나타내면
[7]
[3, 8]
[8, 1, 0]
[2, 7, 4, 4]
[4, 5, 2, 6, 5] 의 형태이므로 조금 더 점화식을 세우기 쉽다.
누적 값에 현재 값을 더해나가며 DP 배열을 채워나간다
행을 i, 열을 j로 나타내면 [3, 8]에서 3에 더할 수 있는 값은 triangle[i-1][j]에 있는 7이고 8에 더할 수 있는 값은 triangle[i-1][j-1]에 있는 7이다. 다음 행으로 넘어와서 8에서 생각하면 triangle[i-1][j]에 있는 3을 더할 수 있고 1에는 triangle[i-1][j]에 있는 8을 더할 수도 있고 triangle[i-1][j-1]에 있는 3을 더할 수도 있다.
따라서, 점화식을 j가 1보다 클 때에는 DP[i][j] = max(DP[i-1][j] + triangle[i][j], DP[i-1][j-1] + triangle[i][j])
0일 때에는 DP[i][j] = DP[i-1][j] + triangle[i][j] 로 세워줄 수 있다.
테스트 케이스를 실행시켜보면 DP 배열은 아래와 같이 누적된다.
7 10 15 18 16 15 20 25 20 19 24 30 27 26 24 |
소스 코드
#include <bits/stdc++.h>
using namespace std;
int solution(vector<vector<int>> triangle) {
int DP[501][501] = { 0, };
DP[0][0] = triangle[0][0];
int ans;
for(int i=1; i<triangle.size(); i++){
for(int j=0; j<triangle[i].size(); j++){
if(j >= 1){
DP[i][j] = max(DP[i-1][j] + triangle[i][j], DP[i-1][j-1] + triangle[i][j]);
}
else {
DP[i][j] = DP[i-1][j] + triangle[i][j];
}
}
}
ans = *max_element(DP[triangle.size() - 1], DP[triangle.size() - 1] + (triangle.size() - 1));
return ans;
}
반응형
'Programming Solve > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 등굣길 / C++ (0) | 2022.03.08 |
---|---|
프로그래머스 - 짝지어 제거하기 / C++ (0) | 2022.03.06 |
프로그래머스 - N으로 표현 / C++ (0) | 2022.03.02 |
프로그래머스 - 여행경로 / C++ (0) | 2022.02.19 |
프로그래머스 - 단어 변환 / C++ (0) | 2022.02.19 |