반응형
문제에서 가장 중요한 조건은 경로를 선택할 때 대각선 왼쪽 혹은 대각선 오른쪽에 있는 것들만 선택할 수 있다는 사실이다. 브루트 포스로 모든 경우의 수를 계산할 수 있지만 효율적이지 못하며 100% 시간 초과일 것이다. (그리고 이미 DP문제인거 알고 들어왔다 ㅎ)
위의 예제 입력의 정답 경로로는 위와 같이 7 - 3 - 8 - 7 - 5 => 30이 될것이다.
<내가 풀이한 방법>
숫자들을 입력받는 즉시 arr배열에서 위의 그림처럼 계산하고 다시 ans값으로 업데이트하는 식으로 풀이하였다.
그리하여 연산이 끝나게 되면 ans []={24, 30, 27, 26, 24}이 되는데 sorting 한 후 가장 큰 값인 30을 출력한다.
<DP코드>
#include <algorithm>
#include <iostream>
using namespace std;
int arr[501];
int ans[501];
int N, tmp;
int main()
{
cin >> N;
for (int i = 1; i <= N; i++)
{
if (i == 1)
{
cin >> ans[1];
arr[1] = ans[1];
continue;
}
else
{
for (int j = 1; j <= i; j++)
{
cin >> tmp;
if (j == 1)
{
arr[j] = tmp + ans[1];
}
else if (j == i)
{
arr[j] = tmp + ans[j-1];
}
else
{
arr[j] = tmp + max(ans[j - 1], ans[j]);
}
}
for (int k = 1; k <= i; k++)
{
ans[k] = arr[k];
}
}
}
sort(ans + 1, ans + 1 + N, greater<int>());
cout << ans[1];
}
DP도 풀다 보면 익숙해지는 것 같다 *^^*
반응형
'🧩PS > 🥈Nomal' 카테고리의 다른 글
[C/C++] 백준 11721번 - 열 개씩 끊어 출력하기 (0) | 2020.11.22 |
---|---|
[C/C++] 백준 10844번 - 쉬운 계단 수(DP) (0) | 2020.11.22 |
[C/C++] 백준 1149번 - RGB거리(DP) (0) | 2020.11.01 |
[C/C++] 백준 9461번 - 파도반 수열(DP) (0) | 2020.10.19 |
[C/C++] 백준 1904번 - 01타일 (DP) (0) | 2020.10.19 |