문제출처: 백준
문제 링크: https://www.acmicpc.net/problem/1932
난이도: ★★☆☆☆
- 문제 분류: 다이나믹 프로그래밍(dp)
[문제]
[분석]
보통의 DP의 문제처럼 bottom-up 방식으로 풀이하면 된다.
본인 위치에 합이 가장 큰 결과를 찾으려면 양쪽 대각선 위에 있는 것 중 최댓값을 찾아 해당값에 자신의 값을 더하는 방법으로 풀면 된다.
또한, 마지막 답을 구할 때, 마지막의 맨마지막 배열에 답이 있었던 기존 방식과 다르게 맨 마지막 N번째 배열의 1~n의 값들을 모두 비교해서 최댓값을 답으로 한다.
코드와 식의 간편성을 위하여 i=0 or j=0인 배열은 0으로 만들어서 따로 base case를 나누지 않더라도 답이 나올 수 있게 하였다.
- 점화식
[코드]
#include <iostream>
using namespace std;
unsigned long long num[501][501];
unsigned long long s[501][501];
int main() {
int n;
unsigned long long max;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++) cin>>num[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
if(s[i-1][j-1]>s[i-1][j]) max=s[i-1][j-1];
else max=s[i-1][j];
s[i][j]=max+num[i][j];
}
}
max=s[n][1];
for(int i=2;i<=n;i++){
if(max<s[n][i]) max=s[n][i];
}
cout<<max<<endl;
return 0;
}
'코딩테스트' 카테고리의 다른 글
[C++] (백준 2193번) 이친수 (0) | 2022.01.17 |
---|---|
[C++] (백준 11051 번) 이항 계수 2 (0) | 2022.01.13 |
[C++] (백준 11726 번) 2×n 타일링 (0) | 2022.01.12 |
[C++] (백준 9095번) 1, 2, 3 더하기 (0) | 2022.01.11 |
[C++] (백준 11053번) 가장 긴 증가하는 부분 수열 (0) | 2022.01.10 |