[BOJ] 1932 정수 삼각형 - 동적 계획법
글 작성자: Sowhat_93


매우 간단한 문제이다.
아래층으로 값을 더하고, 거기 기록한다.
어떠한 인덱스에서 갈수있는 아래층 원소의 인덱스를 구하기 위해서는
현재 인덱스와 내가 속한 레이어의 번호를 더해주면 쉽게 구할수 있다.
인덱스 2는 4와 5로 접근 가능하고, 인덱스 3도 5에 접근 가능하다.
자연스럽게 최대값이 구해진다.

레이어를 하나씩 증가시키면서 원소 개수만큼 루프를 돌리며
바로 다음 레이어의 최대값을 계속 구해주다 보면 원하는 값을 구할 수 있다.
코드로 구현한 결과는 다음과 같다.
#include <iostream> int MaxResult[125251] = { 0 , }; int Cost[125251] = { 0 , }; int main() { std::cin.tie(0); std::cin.sync_with_stdio(false); std::cout.sync_with_stdio(false); int N = 0; std::cin >> N; int Cin = 1; for (int i = 1; i <= N; ++i) { for (int j = 1; j <= i; ++j) std::cin >> Cost[Cin++]; } int LayerStart = 1; MaxResult[1] = Cost[1]; for (int CurrentLayer = 1; CurrentLayer < N; ++CurrentLayer) { int CurrentNumber = LayerStart; for (int k = CurrentNumber; k < CurrentNumber + CurrentLayer; ++k) { if (MaxResult[k + CurrentLayer] < MaxResult[k] + Cost[k + CurrentLayer]) MaxResult[k + CurrentLayer] = MaxResult[k] + Cost[k + CurrentLayer]; if (MaxResult[k + CurrentLayer + 1] < MaxResult[k] + Cost[k + CurrentLayer + 1]) MaxResult[k + CurrentLayer + 1] = MaxResult[k] + Cost[k + CurrentLayer + 1]; } LayerStart = LayerStart + CurrentLayer; } int Max = -1; for (int i = LayerStart; i < LayerStart + N; ++i) { if (MaxResult[i] > Max) Max = MaxResult[i]; } std::cout << Max << std::endl; return 0; }
이 글은
(새창열림)
본 저작자 표시 규칙 하에 배포할 수 있습니다. 자세한 내용은 Creative Commons 라이선스를 확인하세요.
Creative Commons
본 저작자 표시
'알고리즘' 카테고리의 다른 글
[BOJ] 1463 1로 만들기 - 메모이제이션 (0) | 2022.01.13 |
---|---|
[BOJ] 2579 계단 오르기 - 동적계획법 (0) | 2022.01.13 |
[BOJ] 12869 뮤탈리스크 - 완전탐색 (0) | 2021.12.03 |
[BOJ] 13902 개업 2 - 동적 계획법 (0) | 2021.12.03 |
[BOJ] 1904 01타일 - 동적 계획법 (0) | 2021.12.03 |
댓글
이 글 공유하기
다른 글
-
[BOJ] 1463 1로 만들기 - 메모이제이션
[BOJ] 1463 1로 만들기 - 메모이제이션
2022.01.13 -
[BOJ] 2579 계단 오르기 - 동적계획법
[BOJ] 2579 계단 오르기 - 동적계획법
2022.01.13 -
[BOJ] 12869 뮤탈리스크 - 완전탐색
[BOJ] 12869 뮤탈리스크 - 완전탐색
2021.12.03 -
[BOJ] 13902 개업 2 - 동적 계획법
[BOJ] 13902 개업 2 - 동적 계획법
2021.12.03
댓글을 사용할 수 없습니다.