백준 1932 정수 삼각형 [c++]
정수 삼각형 실버1
문제
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
문제 풀이
- dp문제
- 이전 RGB문제와 유사하나 입력받는 행이 1~n까지 다르다.
- i열의 dp값은 이전 dp[i], dp[i-1]중 최대 + input[i]를 하면 되나,
- 삼각형 각 행의 첫 열과 마지막 열은 바로 위의 값에서만 올 수 있으므로 예외처리 해준다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n;
cin >> n;
int tri[n][n];
int dp[n][n];
for(int i = 0; i < n; i++)
{
for(int j = 0; j < i + 1; j++){
cin >> tri[i][j];
}
}
dp[0][0] = tri[0][0];
for(int i = 1; i < n; i++)
{
for(int j = 0; j < i + 1; j++){
if(j == 0){
dp[i][j] = dp[i-1][j] + tri[i][j];
} else if(j == i){
dp[i][j] = dp[i-1][j-1] + tri[i][j];
} else {
dp[i][j] = max(dp[i-1][j-1],dp[i-1][j]) + tri[i][j];
}
}
}
int last[n];
for(int i = 0; i < n; i++)
{
last[i] = dp[n-1][i];
}
sort(last, last + n);
cout << last[n-1] << endl;
return 0;
}
총평
- 삼각형 형태로 생기는 예외만 처리하면 쉬운 DP문제
- dp문제임을 쉽게 알 수 있다.