728x90
SMALL
아이디어
처음엔 삼각형의 위에서부터 1층, ..., k층, ..., n층으로 생각하고
k층까지의 최적의 경로가 n층까지의 최적의 경로에 포함될 것이라 생각할 수도 있다.
그러나 예시로 주어진 테스트케이스가 그 반례이다.
따라서 최적의 경로는, 2차원배열의 각 인덱스에 해당하는 dp[i][j]에 저장되어있다.
그러므로 dp[i][j]에 도달하는 optimal한 경로와 dp[i][j+1]에 도달하는 경로가 다를 것이다.
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + arr[i][j];
를 사용하여 해결하면 된다.
다시 말하자면,
k층까지 탐색했을 때 합이 최대가 되는 것이 최적의 경로가 아니라,
k층의 l열을 오는 데에 합이 최대가 되는 경로가 최적의 경로(dp의 점화식)을 구성한다.
코드
#include <iostream>
using namespace std;
const int MAX = 501;
int arr[MAX][MAX];
int dp[MAX][MAX];
int sum = 0;
int main(void){
int n;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
cin >> arr[i][j];
dp[i][j] = 0;
}
}
dp[0][0] = arr[0][0];
for (int i = 1; i < n; i++) {
for (int j = 0; j <= i; j++) {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + arr[i][j];
}
}
for (int i = 0; i < n; i++) {
sum = max(sum, dp[n-1][i]);
}
cout << sum;
return 0;
}
줄인 코드
#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
const int MAX = 501;
int n, m, map[MAX][MAX] = {0, }, dp[MAX][MAX];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n;
int sum_max = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> map[i][j];
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + map[i][j];
sum_max = max(sum_max, dp[i][j]);
}
}
cout << sum_max;
return 0;
}
728x90
LIST
'PS > BOJ' 카테고리의 다른 글
백준 23304 (C++) 아카라카 (0) | 2022.01.30 |
---|---|
백준 7568 (C++) 덩치 (1) | 2022.01.30 |
백준 8892 (C++) 팰린드롬 (0) | 2022.01.19 |
백준 11091 (c++) 알파벳 전부 쓰기 (0) | 2022.01.18 |
백준 1431 (C++) 시리얼 번호 (0) | 2022.01.13 |