๐Ÿ•๏ธ ICPC Sinchon/Dynamic Programming

[BOJ S2][C++] ๋ฐฑ์ค€ 11048๋ฒˆ: ์ด๋™ํ•˜๊ธฐ

์„ ๋‹ฌ 2022. 9. 27. 16:21
๋ฐ˜์‘ํ˜•

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

 

11048๋ฒˆ: ์ด๋™ํ•˜๊ธฐ

์ค€๊ทœ๋Š” N×M ํฌ๊ธฐ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” 1×1ํฌ๊ธฐ์˜ ๋ฐฉ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๊ณ , ๊ฐ ๋ฐฉ์—๋Š” ์‚ฌํƒ•์ด ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ๋ฐฉ์€ (1, 1)์ด๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋žซ ๋ฐฉ์€ (N, M)์ด๋‹ค. ์ค€๊ทœ๋Š”

www.acmicpc.net

 

๋ฌธ์ œ

์ค€๊ทœ๋Š” N×M ํฌ๊ธฐ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” 1×1ํฌ๊ธฐ์˜ ๋ฐฉ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๊ณ , ๊ฐ ๋ฐฉ์—๋Š” ์‚ฌํƒ•์ด ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ๋ฐฉ์€ (1, 1)์ด๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋žซ ๋ฐฉ์€ (N, M)์ด๋‹ค.

์ค€๊ทœ๋Š” ํ˜„์žฌ (1, 1)์— ์žˆ๊ณ , (N, M)์œผ๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ค€๊ทœ๊ฐ€ (r, c)์— ์žˆ์œผ๋ฉด, (r+1, c), (r, c+1), (r+1, c+1)๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ ๋ฐฉ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฉ์— ๋†“์—ฌ์ ธ์žˆ๋Š” ์‚ฌํƒ•์„ ๋ชจ๋‘ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋˜, ๋ฏธ๋กœ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐˆ ์ˆ˜๋Š” ์—†๋‹ค.

์ค€๊ทœ๊ฐ€ (N, M)์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์‚ฌํƒ• ๊ฐœ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฏธ๋กœ์˜ ํฌ๊ธฐ N, M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N, M ≤ 1,000)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ ์ค„์—๋Š” ์ด M๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, r๋ฒˆ์งธ ์ค„์˜ c๋ฒˆ์งธ ์ˆ˜๋Š” (r, c)์— ๋†“์—ฌ์ ธ ์žˆ๋Š” ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ์‚ฌํƒ•์˜ ๊ฐœ์ˆ˜๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ค€๊ทœ๊ฐ€ (N, M)์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์‚ฌํƒ• ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

int maxCandy(int n, int m, vector<vector<int>> &candy) {
    vector<vector<int>> dp (n, vector<int>(m,0)); // dp[i][j] = {i,j} ๊นŒ์ง€ ์˜ฌ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌํƒ•์˜ ์ตœ๋Œ€ ๊ฐฏ์ˆ˜
    
    // 0๋ฒˆ์งธ ํ–‰๊ณผ 0๋ฒˆ์จฐ ์—ด (=์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด ํ•œ๊ฐ€์ง€๋ฐ–์— ์—†๋Š” ๊ฒฝ์šฐ๋“ค) ๊ตฌํ•ด๋†“๊ธฐ
    dp[0][0] = candy[0][0];
    for(int i=1; i<m; i++)
        dp[0][i] = candy[0][i] + dp[0][i-1];
    for(int i=1; i<n; i++)
        dp[i][0] = candy[i][0] + dp[i-1][0];
    
    for(int i=1; i<n; i++) {
        for(int j=1; j<m; j++) {
            // {i,j}์— ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์„ธ๊ฐ€์ง€ ๊ธธ ์ค‘ ์ตœ๋Œ“๊ฐ’
            int maxTmp = max({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]});
            dp[i][j] = candy[i][j] + maxTmp;
        }
    }

    return dp[n-1][m-1];
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> candy (n, vector<int>(m,0));
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            cin >> candy[i][j];
    
    cout << maxCandy(n, m, candy);
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•