본문 바로가기

Study/Algorithm

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

https://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

 

컨셉

점화식을 만들었다.

path(y,x)  //(y,x)에서 시작하여 맨 아래줄까지 내려가는 부분 경로의 최대합

path(y,x) = triangle(y,x) + max(path(y+1, x+1), path(y+1, x))

 

 

최적부분구조 ;

- 각 부분문제의 최적해 확장 → 전체 문제의 최적해 得

- 지금까지의 선택이 영향을 미치지 않음. 현재 상황에서 최적해를 선택한다

- 중복되는 핵심문제만 추출해야 한다. (계산결과에 영향을 미치는 애들)

- 핵심문제가 아닌 부분 or 어떤 루트를 타든 공통된 부분은 점화식 밖으로 빼버린다. (triangle(y,x)처럼)

 

 

초안

내가 짠 코드 (정답, 28ms)

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

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


int N, triangle[100][100], cache[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];
}

int main()
{
    int C;
    cin >> C;
    while(C--)
    {
        memset(cache, -1, sizeof(cache));
        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 << path(0,0) << endl;

    }
}

 

주의

초기화 꼭 할 것

 

'Study > Algorithm' 카테고리의 다른 글

[동적계획법] 5. 합친 LIS  (0) 2019.08.06
[동적계획법] 4. LIS (미완)  (0) 2019.08.06
[동적계획법]2.와일드카드  (0) 2019.08.06
[동적계획법] 1.외발뛰기  (0) 2019.08.04
[동적계획법] 0. 동적 계획법  (0) 2019.08.04