Baekjoon

Baekjoon 1932번 정수 삼각형

ppwag 2020. 8. 30. 13:35

문제

https://www.acmicpc.net/problem/1932

걸린 시간

00 : 10 : 19

풀이

C++

#include <bits/stdc++.h>
#define INF 987654321
using namespace std;

int n;
int tri[500][500];
int cache[500][500];

int dp(int y, int x){
    // 기저 사례
    if(y == n-1)
        return tri[y][x];
    // 메모이제이션
    int& ret = cache[y][x];
    if(ret != -1)
        return ret;
    // 재귀 호출
    return ret = max(dp(y+1, x), dp(y+1, x+1))+tri[y][x];
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    for(int y = 0; y < n; y++)
        for(int x = 0; x < y+1; x++)
            cin >> tri[y][x];
    memset(cache, -1, sizeof(cache));
    cout << dp(0, 0) << "\n";
    return 0;
}

algospot TRIANGLEPATH 와 똑같은 기초 dp 문제이다. 트리 형태로 주어져 있어 top-down 방식으로 풀이했다.

다른 풀이

C++

#include <bits/stdc++.h>
#define INF 987654321
using namespace std;

int n;
int tri[500][500];
int cache2[2][500];

int dp2(){
    // n층의 값 초기화
    for(int x = 0; x < n; x++)
        cache2[(n+1)%2][x] = tri[n-1][x];
    // 반복 dp
    for(int y = n-2; y >= 0; y--)
        for(int x = 0; x <= y; x++)
            cache2[y%2][x] = max(cache2[(y+1)%2][x], cache2[(y+1)%2][x+1])+tri[y][x];
    return cache2[0][0];
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    for(int y = 0; y < n; y++)
        for(int x = 0; x < y+1; x++)
            cin >> tri[y][x];
    cout << dp2() << "\n";
    return 0;
}

복습할 겸 bottom-up & sliding window 으로도 풀이해보았다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 15652번 N과 M (4)  (0) 2020.08.30
Baekjoon 15650번 N과 M (2)  (0) 2020.08.30
Baekjoon 1149번 RGB거리  (0) 2020.08.30
Baekjoon 17219번 비밀번호 찾기  (0) 2020.08.29
Baekjoon 17626번 Four Squares  (0) 2020.08.29

댓글