본문 바로가기

Study/Algorithm

[동적계획법] 9. 삼각형 위의 최대 경로 수

https://algospot.com/judge/problem/read/TRIPATHCNT

 

algospot.com :: TRIPATHCNT

삼각형 위의 최대 경로 수 세기 문제 정보 문제 9 5 7 1 3 2 3 5 5 6 위 형태와 같이 삼각형 모양으로 배치된 자연수들이 있습니다. 맨 위의 숫자에서 시작해, 한 번에 한 칸씩 아래로 내려가 맨 아래 줄로 내려가는 경로를 만들려고 합니다. 경로는 아래 줄로 내려갈 때마다 바로 아래 숫자, 혹은 오른쪽 아래 숫자로 내려갈 수 있습니다. 이 때 숫자의 합이 가장 큰 경로는 하나가 아니라 여러 개일 수 있습니다. 예를 들어 위 삼각형에서는 {9,

algospot.com

 

 

 

컨셉

 

 

초안

내 코드 (정답, 24ms)

...더보기
/**
 * @name    8.11. 삼각형 위의 최대 경로
 * @ID      TRIPATHCNT
 * @date    2019-08-08
 * @author  Sunmon
 */

#include <iostream>
#include <cstring>
#define MAX(a,b) (a>b? a: b)
using namespace std;

int N;
int triangle[100][100];
int cache[100][100];
int sumCache[100][100];


//(y,x)에서 맨 아래줄까지 내려가는 경로의 최대 합
int path(int y, int x)
{
    if(y == N-1) return triangle[y][x];

    int& ret = cache[y][x];
    if(ret != -1) return ret;

    return ret = MAX(path(y+1, x), path(y+1, x+1)) + triangle[y][x];
}


//(y,x)에서 맨 아래줄까지 내려가는 최대 경로의 개수 리턴
int count(int y, int x)
{
    if(y==N-1) return 1;
    int& ret = sumCache[y][x];
    if(ret != -1) return ret;

    ret = 0;
    if(path(y+1, x) >= path(y+1,x+1)) ret += count(y+1, x);
    if(path(y+1, x) <= path(y+1, x+1)) ret+= count(y+1, x+1);
    return ret;
}

int main()
{
    int C;
    cin >> C;
    while(C--)
    {
        memset(cache, -1, sizeof(cache));
        memset(sumCache, -1, sizeof(sumCache));
        memset(triangle, -1, sizeof(triangle));
        cin >> N;
        
        for(int i = 0; i< N; i++)
            for(int j = 0; j<= i; j++)
                cin >> triangle[i][j];

        cout << count(0,0) << endl;


    }
}

 

주의

a>b, a<b, a==b

세 가지 경우의 수가 있을 때 a==b를 a>=b && a<=b로도 표현할 수 있구나.