๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 2169 : ๋กœ๋ด‡ ์กฐ์ข…ํ•˜๊ธฐ (DP)

by xxilliant 2023. 5. 26.
728x90
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/2169

๋ฌธ์ œ

NASA์—์„œ๋Š” ํ™”์„ฑ ํƒ์‚ฌ๋ฅผ ์œ„ํ•ด ํ™”์„ฑ์— ๋ฌด์„  ์กฐ์ข… ๋กœ๋ด‡์„ ๋ณด๋ƒˆ๋‹ค. ์‹ค์ œ ํ™”์„ฑ์˜ ๋ชจ์Šต์€ ๊ต‰์žฅํžˆ ๋ณต์žกํ•˜์ง€๋งŒ, ๋กœ๋ด‡์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ผ๋งˆ ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€ํ˜•์„ N×M ๋ฐฐ์—ด๋กœ ๋‹จ์ˆœํ™” ํ•˜์—ฌ ์ƒ๊ฐํ•˜๊ธฐ๋กœ ํ•œ๋‹ค.

์ง€ํ˜•์˜ ๊ณ ์ €์ฐจ์˜ ํŠน์„ฑ์ƒ, ๋กœ๋ด‡์€ ์›€์ง์ผ ๋•Œ ๋ฐฐ์—ด์—์„œ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜์ชฝ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์œ„์ชฝ์œผ๋กœ๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ํ•œ ๋ฒˆ ํƒ์‚ฌํ•œ ์ง€์—ญ(๋ฐฐ์—ด์—์„œ ํ•˜๋‚˜์˜ ์นธ)์€ ํƒ์‚ฌํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ์ง€์—ญ์€ ํƒ์‚ฌ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”๋ฐ, ๋กœ๋ด‡์„ ๋ฐฐ์—ด์˜ ์™ผ์ชฝ ์œ„ (1, 1)์—์„œ ์ถœ๋ฐœ์‹œ์ผœ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ (N, M)์œผ๋กœ ๋ณด๋‚ด๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ์œ„์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ, ํƒ์‚ฌํ•œ ์ง€์—ญ๋“ค์˜ ๊ฐ€์น˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N, M(1≤N, M≤1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ˆ˜๋กœ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 100์„ ๋„˜์ง€ ์•Š๋Š” ์ •์ˆ˜์ด๋‹ค. ์ด ๊ฐ’์€ ๊ทธ ์ง€์—ญ์˜ ๊ฐ€์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.


๋ฐฑ์ค€ ๊ณจ๋“œ2 dp๋ฌธ์ œ!

์ž์นซํ•˜๋ฉด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ๋กœ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  60ํผ์„ผํŠธ ์ •๋„์—์„œ ํ‹€๋ฆฐ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ „์ฒด๊ฐ€ ์Œ์ˆ˜์ธ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๊ณ ๋ คํ•ด๋ณผ ๊ฒƒ!

์ œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ‹€๋ ธ์–ด์š”,,,

 

๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฆฌ๋ฉด์„œ dp๋ฅผ ์ฑ„์šธ ๋•Œ, ๋ฒ”์œ„๋ฅผ ์ž˜ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

์ด์ฐจ์›๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋„์›€์ด ๋œ๋‹ค^-^

 

์œผ์•„์•„

๋‚˜์˜ ํ’€์ด

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int n;
int m;
int map[1001][1001];
int fromRight[1001];
int fromLeft[1001];
int dp[1001][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; j <= m; ++j){
            cin >> map[i][j];
        }
    }

    for (int j = 1; j <= m; ++j)
    { // ๋งจ ์œ—์ค„
        dp[1][j] += dp[1][j - 1] + map[1][j];
    }

    for (int i = 2; i <= n; ++i){
        // ์™ผ vs ์œ„
        fromLeft[1] = dp[i - 1][1] + map[i][1];
        fromRight[m] = dp[i - 1][m] + map[i][m];
        for (int j = 2; j <= m; ++j){
            fromLeft[j] = max(dp[i - 1][j], fromLeft[j - 1]) + map[i][j];
        }
        // ์˜ค vs ์œ„
        for (int j = m-1; j > 0; --j){
            fromRight[j] = max(dp[i - 1][j], fromRight[j + 1])+ map[i][j];
        }
        // max๋ฅผ dp์— ์ €์žฅ
        for (int j = 1; j <= m; ++j){
            dp[i][j] = max(fromLeft[j], fromRight[j]);
        }
    }
    
    // cout << "\n";
    // for (int i = 0; i <= n+1; ++i){
    //     for (int j = 0; j <= m+1; ++j){
    //         cout << dp[i][j] << " ";
    //     }
    //     cout << "\n";
    // }

    cout << dp[n][m];
}

 

728x90
๋ฐ˜์‘ํ˜•