Baekjoon Review

[Silver 1] 1932번 정수 삼각형

hanseongbugi 2023. 11. 8. 16:57

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

 

1932번: 정수 삼각형

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

www.acmicpc.net

 

이 문제는 DP를 통해 해결할 수 있다.

 

알고리즘은 다음과 같다.

  • 삼각형의 최대 크기는 500까지이다. 따라서 501x501크기의 배열을 선언하여 삼각형의 비용을 저장한다.
  • DP를 위한 배열은 삼각형의 크기와 동일하게 선언한다. (모든 경로의 비용을 계산하기 위해)
  • dp 배열의 첫번째 경로와 두번째 경로를 저장한다.
  • 반복을 통해 왼쪽 경로와 오른쪽 경로를 계속해서 저장한다. 
  • 겹치는 노드가 있기 떄문에 max 함수를 통해 최대 값인 경우를 저장한다.
    • max 함수는 위아래 모두 있을 필요 없다. (실수)
    • dp[i][j]인 경우만 max를 통해 겹치는 노드를 검사해도 된다.

 

#include <iostream>
using namespace std;
int N;
int arr[501][501];
int dp[501][501];


int main() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j <= i; j++) {
			cin >> arr[i][j];
		}
	}
	dp[0][0] = arr[0][0];
	dp[1][0] = dp[0][0] + arr[1][0];
	dp[1][1] = dp[0][0] + arr[1][1];


	for (int i = 2; i < N; i++) {
		for (int j = 0; j < i; j+=1) {
			dp[i][j] = max(dp[i][j], dp[i - 1][j] + arr[i][j]);
			dp[i][j + 1] = max(dp[i][j + 1], dp[i - 1][j] + arr[i][j + 1]);
		}
	}
	int result = 0;
	for (int i = 0; i < N; i++)
		result = max(result, dp[N - 1][i]);

	cout << result << '\n';
}