Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 문자열
  • 정수론
  • 트라이
  • 구현
  • 이분탐색
  • 누적합
  • 유니온 파인드
  • 스택
  • 위상 정렬
  • 기하
  • 조합론
  • 브루트포스
  • 우선순위큐
  • 백준
  • 최소 스패닝 트리
  • SCC
  • 트리
  • 정렬
  • 그래프
  • 백트래킹
  • KMP
  • 분할정복
  • 투포인터
  • 큐
  • C++
  • 동적계획법
  • 수학
  • UC++
  • 세그먼트 트리
  • LCA

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 1932번 문제
공부 및 정리/백준 코드

[C++]백준 - 1932번 문제

2021. 6. 18. 19:59

1932번: 정수 삼각형 (acmicpc.net)

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net

 

1932번 : 정수 삼각형


 

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

 

입력


첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

 

 

출력


첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

 

 


 

생각해 볼 점


맨 아래에서 부터 위 쪽 방향으로, 더하면서 올라갈 때, 가장 큰 값을 가지는 부분을 동적 계획법(dp) 배열로 저장하면서 올라갑니다.

 

예시)

 

n=0        1

n=1     2     3

 

tri[n][k] = 정수 삼각형의 n번째 행, k 번째 숫자

-> dp[0][0] = tri[0][0] + max(dp[1][0], dp[1][1])

 

위와 같은 방법을 고려하면,

=> dp[n][k] = tri[n][k] + max(dp[n+1][k], dp[n][k+1])

 

위와 같은 식을 사용하여, 최종적으로는 dp[0][0]이 답이 됩니다.

 

코드


#include <iostream>
using namespace std;
int tri[500][500] = {0, };
int dp[500][500] = {0, };

int solution(int level, int N, int k)
{
    if(level == N) return 0;

    if(dp[level][k] == 0)
    {
        int ret = solution(level + 1, N, k);
        int ret_b = solution(level + 1, N, k + 1);
        if(ret < ret_b) ret = ret_b;
        dp[level][k] = ret + tri[level][k];
    }
    return dp[level][k];
}


int main()
{
    int N;
    cin >> N;
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < i+1; j++) cin >> tri[i][j];
    }
    
    cout << solution(0, N, 0);
    
    return 0;
}

 

그 외


 

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 1463번 문제  (0) 2021.06.18
[C++]백준 - 2579번 문제  (0) 2021.06.18
[C++]백준 - 1149번 문제  (0) 2021.06.17
[C++]백준 - 1920번 문제  (0) 2021.06.17
[C++]백준 - 5430번 문제  (0) 2021.06.17
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 1463번 문제
    • [C++]백준 - 2579번 문제
    • [C++]백준 - 1149번 문제
    • [C++]백준 - 1920번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바