본문 바로가기

PS/그 외 다른 사이트

[알고스팟 TRIANGLEPATH] 삼각형 위의 최대 경로 C++

728x90

algospot.com/judge/problem/read/TRIANGLEPATH

 

algospot.com :: TRIANGLEPATH

삼각형 위의 최대 경로 문제 정보 문제 6 1 2 3 7 4 9 4 1 7 2 7 5 9 4 위 형태와 같이 삼각형 모양으로 배치된 자연수들이 있습니다. 맨 위의 숫자에서 시작해, 한 번에 한 칸씩 아래로 내려가 맨 아래

algospot.com

 

전체 최적해를 구하는 방식을 썼다가 최적 부분 구조를 책으로 이해하고 짠 코드

동적계획법 진짜 어려웠는데 종만북보고 차차 알아가는재미가 너무 좋다

 

 

만약 아래, 오른쪽아래 

둘중 아무 값이나 현재의 값과 더했을때 큰 수를 구할 수 있다면

이를 dp를 이용해서 전체해의 최적값으로 연결지을 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cstring>
#include <algorithm>
 
using namespace std;
int arr[100][100];
int dp[100][100];
int n;
 
//부분 문제의 최적구조를 가지면 전체해도 최적됨
int path(int y, int x) {
    //기저 : 마지막 케이스까지 도달했으면 끝
    if (y == n - 1return arr[y][x];
    //메모이제이션
    int& ret = dp[y][x];
    if (dp[y][x] != -1return ret;
 
    //부문문제 두경우중 가장 큰 수
    return ret = max(path(y + 1, x), path(y + 1, x + 1)) + arr[y][x];
}
int main() {
    int c;
 
    cin >> c;
    while (c--) {
        memset(dp, -1sizeof(dp));
        cin >> n;
        for (int i = 0; i < n; i++)
            for (int j = 0; j <= i; j++)
                cin >> arr[i][j];
        cout << path(00<< '\n';
    }
    return 0;
}
cs
728x90