해설
지나갈 수 있는 모든 경로를 재귀로 해결하면 O(2^n)으로 TLE가 발생한다.
dp 방법을 이용하여 O(n^2)에 해결해보자.
dp[i][j]를 triangle[i][j]에 도달할때까지의 최대 합이라고 설정하면, dp[i][j]까지 도달하는 방법은 두가지가 있다.
1) (i-1, j-1)에서 오른쪽으로 내려오는 방법
2) (i-1, j)에서 왼쪽으로 내려오는 방법
따라서, dp[i][j]의 값은 dp[i-1][j-1]과 dp[i-1][j] 중 더 큰 값에 triangle[i][j] 를 더한 값이다.
점화식을 세워보면, dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j] 가 된다.
모든 행에 대하여 dp 값을 구한 후, triangle.size()-1 행의 dp값 중 최대값을 리턴하면 정답이다.
코드
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <tuple>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <cctype>
#include <climits>
#include <iostream>
using namespace std;
using ii = pair<int, int>;
using iii = tuple<int, int, int>;
#define X first
#define Y second
int dp[505][505];
int solution(vector<vector<int>> triangle) {
int r = triangle.size();
for (int i=0; i<r; i++) {
for (int j=0; j<i+1; j++) {
if (j >= 1) dp[i][j] = dp[i-1][j-1];
if (j+1 <= i) dp[i][j] = max(dp[i][j], dp[i-1][j]);
dp[i][j] += triangle[i][j];
}
}
int mx = 0;
for (int i=0; i<r; i++)
mx = max(mx, dp[r-1][i]);
return mx;
}
'ㄴ 알고리즘 > 프로그래머스풀이' 카테고리의 다른 글
[프로그래머스 lv3] 기지국 설치 풀이 (0) | 2022.09.09 |
---|---|
[프로그래머스 lv3] 등굣길 풀이 (0) | 2022.09.08 |
[프로그래머스 lv3] 이중우선순위큐 풀이 (0) | 2022.09.07 |
[프로그래머스 lv3] 징검다리 건너기 풀이 (0) | 2022.09.07 |
[프로그래머스 lv3] 단속카메라 풀이 (0) | 2022.09.06 |
댓글