728x90
∙문제 해결 방법
- 정수 삼각형을 직각 삼각형 형태로 표현할 경우, 임의의 좌표 (x, y)에 이동하기 위해서는 (x - 1, y -1) 또는 (x, y - 1)좌표를 거쳐야한다.
- 임의의 좌표 (x, y)에서의 삼각형 정수 값을 tri(x, y)라고 하고, 꼭대기 좌표에서 (x, y)까지 이동할 때의 정수 합의 최댓값을 dp(x, y)라고 할 경우 아래의 식이 성립된다.
- 꼭대기 좌표부터 시작하여 왼쪽에서 오른쪽으로 위에서 아래 방향으로 dp(x, y) 값을 계산하고, 최종적으로 삼각형 바닥에서 dp(x, y)의 최댓값 구한다.
∙ 정수 삼각형 문제의 솔루션 함수의 예
int solution(vector<vector<int>> triangle)
{
vector<vector<int>> dp = triangle;
int n = triangle.size();
for (int y = 1; y < n; y++) {
for (int x = 0; x <= y; x++) {
if (x == 0)
dp[y][x] = dp[y - 1][x] + triangle[y][x];
else if (x == y)
dp[y][x] = dp[y - 1][x - 1] + triangle[y][x];
else
dp[y][x] = max(dp[y - 1][x - 1], dp[y - 1][x]) + triangle[y][x];
}
}
return *max_element(dp[n - 1].begin(), dp[n - 1].end());
}
- 실행 코드
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> triangle)
{
vector<vector<int>> dp = triangle;
int n = triangle.size();
for (int y = 1; y < n; y++) {
for (int x = 0; x <= y; x++) {
if (x == 0)
dp[y][x] = dp[y - 1][x] + triangle[y][x];
else if (x == y)
dp[y][x] = dp[y - 1][x - 1] + triangle[y][x];
else
dp[y][x] = max(dp[y - 1][x - 1], dp[y - 1][x]) + triangle[y][x];
}
}
return *max_element(dp[n - 1].begin(), dp[n - 1].end());
}
int main()
{
vector<vector<int>> tri {
{7},
{3, 8},
{8, 1, 0},
{2, 7, 4, 4},
{4, 5, 2, 6, 5}
};
cout << solution(tri) << endl;
}
'코딩 및 기타 > 어서와! 자료구조와 알고리즘' 카테고리의 다른 글
투포인터, 슬라이딩 윈도우 알고리즘 (0) | 2023.09.30 |
---|---|
C++ 문법 뽀개기 (0) | 2023.09.04 |
동적 계획법 응용 : 최소 비용 경로 (0) | 2023.09.01 |
동적 계획법 (0) | 2023.09.01 |
그래프 순회 응용 (네트워크) (0) | 2023.09.01 |