본문 바로가기
온라인저지

[BOJ] 11048번: 이동하기

by plzfday 2018. 6. 4.

11048번: 이동하기

풀이

간단히 바로 생각나는 점화식은
dp[i][j]=max(dp[i−1][j],dp[i−1][j−1],dp[i][j−1])dp[i][j] = max(dp[i - 1][j], dp[i - 1][j-1], dp[i][j-1])인데 캔디 개수로 음수가 나올리가 없으므로 dp[i−1][j−1]dp[i-1][j-1]을 도는 것은 사치다.

최대한 많이 얻어야 좋은 건데 바로 한 단계를 건너뛰는 것은 엄연한 사치다.
그래서 dp[i][j]=max(dp[i−1][j],dp[i][j−1])dp[i][j] = max(dp[i - 1][j], dp[i][j-1])까지 줄일 수 있다.

dp 배열을 1차원까지 줄일 수 있는데 위로 못 올라가기 때문에 가능한 것인데, dp[j - 1]은 dp[i][j - 1]의 최댓값, dp[j]은 dp[i][j]의 최댓값이 된다. 한 번 손으로 해보면 왜 그런지 알 수 있다.

코드

#include <iostream>
using namespace std;
inline int max(int a, int b) { return a > b ? a : b; }
int n, m, dp[1001];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1, a; j <= m; ++j)
        {
            cin >> a;
            dp[j] = max(dp[j - 1], dp[j]) + a;
        }
    }
    cout << dp[m];
    return 0;
}

 

'온라인저지' 카테고리의 다른 글

[BOJ] 2589번: 보물섬  (0) 2018.07.13
[BOJ] 2608번: 로마 숫자  (1) 2018.07.12
[BOJ] 2607번: 비슷한 단어  (0) 2018.07.12
[BOJ] 1932번: 정수 삼각형  (0) 2018.06.04
[BOJ] 11057번: 오르막 수  (0) 2018.06.03
[BOJ] 1010번: 다리 놓기  (0) 2018.06.03

댓글