본문 바로가기

알고리즘/Algospot

TRIANGLEPATH

TRIANGLEPATH


기본적인 DP 문제.


시간 복잡도는 한줄 밑으로 내려갈 때마다 2배씩 증가하므로 2^n-1 이 된다.


따라서 n의 최대값이 100이 시간 내에 구할 수 없게 되므로 DP 를 이용해야 한다.


cache[x][y] 는 x,y 에서 얻을 수 있는 최대 점수


cache[x][y] = map[x][y]        + max(cache[x+1][y] , cache[x+1][y+1])


현재 자신의 값 + MAX((x+1,y) 에서 얻을 수 있는 최대값 (x+1,y+1)에서 얻을 수 있는 최대값)


가 되므로 이를 재귀 함수를 이용해서 구현할 수 있다.


굳이 cache 값을 -1로 초기화 하지 않은 이유는, 조건에서 map에 들어가는 값은 1이상 이기 때문에


<정답 코드>


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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int map[101][101];
int cache[101][101];
 
int go(int x, int y)
{
    int &ret = cache[x][y];
    
    //기저 조건 : 맨 마지막 행에 도달했을 때
    if (x == n) {
 
        return map[x][y];
    }
 
    // 캐시 값이 존재할 때
    if (ret != 0)
    {
        return ret;
    }
 
    //최대값에 자신의 값을 더한 값
 
    ret += max(go(x + 1, y), go(x + 1, y + 1)) + map[x][y];
 
 
    return ret;
 
 
}
void init()
{
    for(int i=0;i<101;i++)
        for (int j = 0; j < 101; j++)
        {
            map[i][j] = 0;
            cache[i][j] = 0;
        }
}
int main()
{
    //freopen("input.txt", "r", stdin);
    int tc;
    cin >> tc;
    for (int t = 1; t <= tc; t++) {
        init();
        cin >> n;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                cin >> map[i][j];
            }
        }
 
        cout << go(0,0<< endl;
 
    }
 
    return 0;
}
cs


반응형

'알고리즘 > Algospot' 카테고리의 다른 글

LIS  (0) 2018.07.13
WILD CARD  (0) 2018.07.10
JUMPGAME(C언어)  (0) 2018.07.04
DICTIONARY  (0) 2018.07.03
CLOCKSYNC(C언어)  (0) 2018.06.28