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

[BOJ][C++] ๋ฐฑ์ค€ 1577๋ฒˆ: ๋„๋กœ์˜ ๊ฐœ์ˆ˜

์„ ๋‹ฌ 2024. 9. 16. 05:10
๋ฐ˜์‘ํ˜•

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

 

๋ฌธ์ œ

์„ธ์ค€์ด๊ฐ€ ์‚ด๊ณ  ์žˆ๋Š” ๋„์‹œ๋Š” ์‹ ๊ธฐํ•˜๊ฒŒ ์ƒ๊ฒผ๋‹ค. ์ด ๋„์‹œ๋Š” ๊ฒฉ์žํ˜•ํƒœ๋กœ ์ƒ๊ฒผ๊ณ , ์ง์‚ฌ๊ฐํ˜•์ด๋‹ค. ๋„์‹œ์˜ ๊ฐ€๋กœ ํฌ๊ธฐ๋Š” N์ด๊ณ , ์„ธ๋กœ ํฌ๊ธฐ๋Š” M์ด๋‹ค. ๋˜, ์„ธ์ค€์ด์˜ ์ง‘์€ (0, 0)์— ์žˆ๊ณ , ์„ธ์ค€์ด์˜ ํ•™๊ต๋Š” (N, M)์— ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ๋‹ค.

์„ธ์ค€์ด๋Š” ์ง‘์—์„œ ํ•™๊ต๋กœ ๊ฐ€๋Š” ๊ธธ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์ด ๋ช‡ ๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์„ธ์ค€์ด๋Š” ํ•ญ์ƒ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋กœ๋งŒ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์—, ํ•ญ์ƒ ๋„๋กœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ N + M๊ฐœ ๊ฑฐ์นœ๋‹ค. ํ•˜์ง€๋งŒ, ์ตœ๊ทผ ๋“ค์–ด ์ด ๋„์‹œ์˜ ๋„๋กœ๊ฐ€ ๋ถ€์‹ค๊ณต์‚ฌ ์˜ํ˜น์œผ๋กœ ๊ณต์‚ฌ์ค‘์ธ ๊ณณ์ด ์žˆ๋‹ค. ๋„๋กœ๊ฐ€ ๊ณต์‚ฌ ์ค‘์ผ ๋•Œ๋Š”, ์ด ๋„๋กœ๋ฅผ ์ง€๋‚  ์ˆ˜ ์—†๋‹ค.

(0, 0)์—์„œ (N, M)๊นŒ์ง€ ๊ฐ€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„๋กœ์˜ ๊ฐ€๋กœ ํฌ๊ธฐ N๊ณผ ์„ธ๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. N๊ณผ M์€ 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ๊ณต์‚ฌ์ค‘์ธ ๋„๋กœ์˜ ๊ฐœ์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. K๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ K๊ฐœ ์ค„์—๋Š” ๊ณต์‚ฌ์ค‘์ธ ๋„๋กœ์˜ ์ •๋ณด๊ฐ€ a b c d์™€ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. a์™€ c๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , b์™€ d๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , M๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , (a, b)์™€ (c, d)์˜ ๊ฑฐ๋ฆฌ๋Š” ํ•ญ์ƒ 1์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— (0, 0)์—์„œ (N, M)๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด ๊ฐ’์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 263-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

 

ํ’€์ด

dp[i][j] : (i,j) ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ฐฏ์ˆ˜

dp[i][j] = dp[i-1][j] + dp[i][j-1]

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ์ œ

 

์ด ๋ฌธ์ œ์˜ ์Ÿ์ ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ๋„๋กœ์˜ ์กด์žฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š๋ƒ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๋„๋กœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ ์ด๋ผ๋Š” ๊ดด์ƒํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค

ํ•„์ž๋Š” road[i][j][] ํ˜•ํƒœ์˜ ์‚ผ์ค‘๋ฐฐ์—ด๋กœ ๋„๋กœ๋ฅผ ์ง€๋‚  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๋„ฃ์–ด๋’€๋‹ค

 

road[i][j][0] = (i-1, j)์—์„œ (i,j)๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ => ์„ธ๋กœ(์•„๋ž˜์ชฝ ๋ฐฉํ–ฅ) ๋„๋กœ

road[i][j][1] = (i, j-1)์—์„œ (i,j)๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ => ๊ฐ€๋กœ(์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ) ๋„๋กœ

 

๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ์€ ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ ์˜ ์œ„์น˜์˜ ์ˆœ์„œ๋ฅผ ๋”ฐ๋กœ ์ •ํ•ด์„œ ์ฃผ๋Š”๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—

๊ณต์‚ฌ์ค‘์ธ ๋„๋กœ ์ •๋ณด๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„์„œ ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ 

๋ฐฉ๊ธˆ ๋ฐ›์€ ๋„๋กœ๊ฐ€ road[i][j][0] ์ธ์ง€ road[i][j][1]์ธ์ง€ ์ž˜ ํ‘œ์‹œํ•ด์•ผํ•œ๋‹ค

    for(int i=0; i<k; i++) {
        int a,b,c,d;
        cin >> a >> b >> c >> d;
        if(a*100+b > c*100+d) {
            int tmp;
            tmp=a; a=c; c=tmp;
            tmp=b; b=d; d=tmp;
        }
        if(a==c) {
            road[c][d][1] = false;
        } else {
            road[c][d][0] = false;
        }
    }

 

์ž…๋ ฅ์ด ์ž˜ ๋˜์—ˆ๋‹ค๋ฉด ์ดํ›„ dp ํ’€์ด๋Š” ์‰ฝ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ dp[i][j] = dp[i-1][j] + dp[i][j-1] ์ง€๋งŒ

์œ„์—์„œ ์˜ค๋Š” ๋„๋กœ๊ฐ€ ๋ง‰ํ˜”๋‹ค๋ฉด dp[i-1][j]๋ฅผ ๋”ํ•˜์ง€ ์•Š๊ณ 

์™ผ์ชฝ์—์„œ ์˜ค๋Š” ๋„๋กœ๊ฐ€ ๋ง‰ํ˜”๋‹ค๋ฉด dp[i][j-1]๋ฅผ ๋”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค.

    // Dp ํ’€์ด
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            if(road[i][j][0]) {
                dp[i][j] += dp[i-1][j];
            }
            if(road[i][j][1]) {
                dp[i][j] += dp[i][j-1];
            }
        }
    }

 

์ฝ”๋“œ

//ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> ci;
typedef long long ll;

const int INF = 101;
bool road[INF][INF][2];

int main() {
    // road ์ดˆ๊ธฐํ™”
    for(int i=0; i<INF; i++) {
        for(int j=0; j<INF; j++) {
            road[i][j][0] = true;
            road[i][j][1] = true;
        }
    }
    
    // ์ž…๋ ฅ
    int n, m, k;
    cin >> n >> m >> k;
    for(int i=0; i<k; i++) {
        int a,b,c,d;
        cin >> a >> b >> c >> d;
        if(a*100+b > c*100+d) {
            int tmp;
            tmp=a; a=c; c=tmp;
            tmp=b; b=d; d=tmp;
        }
        if(a==c) {
            road[c][d][1] = false;
        } else {
            road[c][d][0] = false;
        }
    }
    
    // dp ์ดˆ๊ธฐํ™”
    vector<vector<ll>>dp(n+1, vector<ll>(m+1, 0));
    dp[0][0] = 1;
    for(int i=1; i<=n; i++) {
        if(road[i][0][0]) {
            dp[i][0] = 1;
        } else {
            break;
        }
    }
    for(int j=1; j<=m; j++) {
        if(road[0][j][1]) {
            dp[0][j] = 1;
        } else {
           break;
        }
    }
    
    // Dp ํ’€์ด
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            if(road[i][j][0]) {
                dp[i][j] += dp[i-1][j];
            }
            if(road[i][j][1]) {
                dp[i][j] += dp[i][j-1];
            }
        }
    }
    
    // ์ถœ๋ ฅ
    cout << dp[n][m];
    
    return 0;
}
๋ฐ˜์‘ํ˜•