알고리즘 문제 풀이

문제

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

 

1932번: 정수 삼각형

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

www.acmicpc.net


풀이

DP 방식으로 접근한다.

점화식은 기본적으로 DP[i][j] = ARR[i-1][j] + MAX(DP[i-1][j], DP[i-1][j-1])이나 맨앞 맨끝의 경우는 비교 대상이 없으므로 DP[i][j] = ARR[i-1][j] +DP[i-1][j] || DP[i][j] = ARR[i-1][j] + DP[i-1][j-1] 을 조건문 처리로 해결했다

기본적으로 실버1의 난이도 문제치곤 점화식과 최전방 최후방의 두가지의 예외처리만 해주면 되는 간단한 문제였다


소스 코드

#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <cctype>
#include <set>
#include <string.h>

using namespace std;

int N, sum = 0;
int arr[501][501];
int dp[501][501];

int main() { 
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j <= i; j++) {
			cin >> arr[i][j];
			if(i == 0 && j == 0)
				dp[i][j] = arr[i][j];
			if (i != 0) {
				if (j == 0) {
					dp[i][j] = arr[i][j] + dp[i - 1][j];
				}
				else if (j == i) {
					dp[i][j] = arr[i][j] + dp[i - 1][j - 1];
				}
				else {
					dp[i][j] = arr[i][j] + max(dp[i - 1][j], dp[i - 1][j - 1]);
				}
			}
		}
	}

	int max = 0;
	for (int i = 0; i <= N; i++) {
		if (dp[N-1][i] > max)
			max = dp[N-1][i];
	}

	cout << max;
}

'Programming Practice > BOJ' 카테고리의 다른 글

[BOJ] 백준 9465 스티커 (C++)  (0) 2022.04.27
[BOJ] 백준 1991 트리 순회 (C++)  (0) 2022.04.26
[BOJ] 백준 2407 조합 (C++)  (0) 2022.04.21
[BOJ] 백준 15650 N과 M (2) (C++)  (0) 2022.04.20
[BOJ] 백준 1149 RGB거리 (C++)  (0) 2022.04.20

+ Recent posts