https://programmers.co.kr/learn/courses/30/lessons/43105
DP문제이다.
아래와 같은 삼각형이 있을때, 위에서 밑으로 내려가는 방향으로 2차원 dp배열을 통해 최대 누적합을 갱신시켜주었다.
그리고, 맨 아래에 있는 누적합 결과중 가장 큰 값을 출력해주었다.
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
↓
7
10 15
18 16 15
20 25 20 19
24 30 27 25 24 => 제일 큰 누적합은 30
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int dp[500][500];
int solution(vector<vector<int>> triangle) {
int answer = 0;
dp[0][0] = triangle[0][0]; //맨 꼭대기
int height = triangle.size() - 1;
for (int i = 0; i < height; i++){ //맨 아래높이의 위까지
for (int j = 0; j < triangle[i].size(); j++) { //해당 높이의 길이만큼
for (int k = 0; k < 2; k++) { //왼쪽&오른쪽
int next = triangle[i+1][j + k];
dp[i + 1][j + k] = max(dp[i + 1][j + k], dp[i][j] + next); //누적합 큰걸로 업데이트
}
}
}
for (int i = 0; i < triangle[height].size(); i++){//맨 아래의 값중 가장 큰거
answer = max(answer, dp[height][i]);
}
return answer;
}
int main() {
cout << solution({ {7},{3, 8},{8, 1, 0},{2, 7, 4, 4},{4, 5, 2, 6, 5 } }) << endl;
}
'Algorithm > DP' 카테고리의 다른 글
[백준] 구간 합 구하기 5 (C++) (0) | 2021.10.08 |
---|---|
[백준] 1753번 : 최단경로 (C++, 다익스트라) (0) | 2021.09.17 |
[백준] 10164번 : 격자상의 경로 (0) | 2021.09.03 |
[백준] 1495번 : 기타리스트 (0) | 2021.08.31 |
[백준] 5557번 : 1학년 (C++) (0) | 2021.08.28 |
댓글