알고리즘 문제 풀이
문제
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 |