Link https://www.acmicpc.net/problem/11048
결과 9800 KB / 76 ms
언어 C++17
풀이
시작점 (0, 0)을 제외하고서 (x-1, y) , (x-1, y-1) , (x, y-1) 세군데 중 누적된 최고값을 가져온다.
DP는 어렵다.
소스코드
#include <iostream>
using namespace std;
const short MAX = 1000;
int board[MAX][MAX];
int dp[MAX][MAX];
const int posX[] = { -1, 0, -1 };
const int posY[] = { 0, -1, -1 };
int max(const int& a, const int& b, const int& c) {
if (a < b && c < b)
return b;
else if (a < c && b < c)
return c;
return a;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m; cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> board[i][j];
dp[0][0] = board[0][0];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i || j) {
int sum[3] = {};
for (int k = 0; k < 3; k++) {
int beforeX = i + posX[k];
int beforeY = j + posY[k];
if (0 <= beforeX && beforeX < n && 0 <= beforeY && beforeY < m)
sum[k] = board[i][j] + dp[beforeX][beforeY];
}
dp[i][j] = max(sum[0], sum[1], sum[2]);
}
}
}
cout << dp[n - 1][m - 1];
return 0;
}
'Algorithm > Dynamic Programming' 카테고리의 다른 글
Baekjoon 2748 피보나치 수 2 (0) | 2019.11.11 |
---|---|
Baekjoon 17358 복불복으로 지구 멸망 (0) | 2019.11.11 |
Baekjoon 3908 서로 다른 소수의 합 (0) | 2019.11.11 |
Baekjoon 17291 새끼치기 (0) | 2019.08.21 |
Baekjoon 5557 1학년 (0) | 2019.08.19 |