알고리즘
[C++] 백준 1932번 정수 삼각형
J3SUNG
2019. 5. 17. 03:10
728x90
다이나믹 프로그래밍 문제입니다.
피라미드모양에 각각 값들이 들어가있습니다.
위에서부터 왼쪽이나 오른쪽을 통해 내려올 때
합이 최대가 되는 경로의 값을 찾는 문제입니다.
경우의 수는
1. 위치가 가장자리일 때
2. 위치가 중앙일 때
2가지가 있습니다.
1번의 경우 바로 위의 값을 더해서 DP에 넣어주고
2번의 경우 바로 위의 값이 더할 수 있는 두개의 수를 비교해서 큰값을 더해서 DP에 저장합니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
int n;
int value = 0;
int arr[510][510];
cin >> n;
for(int i=0; i<n; ++i){
for(int j=0; j<=i; ++j){
cin >> arr[i][j];
}
}
for(int i=1; i<n; ++i){
for(int j=0; j<=i; ++j){
if(j==0){
arr[i][j] += arr[i-1][j];
}
else if(j==i){
arr[i][j] += arr[i-1][j-1];
}
else{
arr[i][j] += max(arr[i-1][j], arr[i-1][j-1]);
}
}
}
for(int i=0; i<n; ++i){
if(value < arr[n-1][i]){
value = arr[n-1][i];
}
}
cout << value;
return 0;
}