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

[C++/BOJ] 1890 : ์ ํ”„ (DP)

by xxilliant 2023. 3. 16.
728x90
๋ฐ˜์‘ํ˜•

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

 

๋ฌธ์ œ

N×N ๊ฒŒ์ž„ํŒ์— ์ˆ˜๊ฐ€ ์ ํ˜€์ ธ ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์˜ ๋ชฉํ‘œ๋Š” ๊ฐ€์žฅ ์™ผ์ชฝ ์œ„ ์นธ์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ์œผ๋กœ ๊ทœ์น™์— ๋งž๊ฒŒ ์ ํ”„๋ฅผ ํ•ด์„œ ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ ์นธ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋Š” ํ˜„์žฌ ์นธ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ ์˜ค๋ฅธ์ชฝ์ด๋‚˜ ์•„๋ž˜์ชฝ์œผ๋กœ๋งŒ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค. 0์€ ๋” ์ด์ƒ ์ง„ํ–‰์„ ๋ง‰๋Š” ์ข…์ฐฉ์ ์ด๋ฉฐ, ํ•ญ์ƒ ํ˜„์žฌ ์นธ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋งŒํผ ์˜ค๋ฅธ์ชฝ์ด๋‚˜ ์•„๋ž˜๋กœ ๊ฐ€์•ผ ํ•œ๋‹ค. ํ•œ ๋ฒˆ ์ ํ”„๋ฅผ ํ•  ๋•Œ, ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋ฉด ์•ˆ ๋œ๋‹ค. ์ฆ‰, ํ•œ ์นธ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ ํ”„๋ฅผ ํ•˜๊ฑฐ๋‚˜, ์•„๋ž˜๋กœ ์ ํ”„๋ฅผ ํ•˜๋Š” ๋‘ ๊ฒฝ์šฐ๋งŒ ์กด์žฌํ•œ๋‹ค.

๊ฐ€์žฅ ์™ผ์ชฝ ์œ„ ์นธ์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ์œผ๋กœ ๊ทœ์น™์— ๋งž๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ฒŒ์ž„ ํŒ์˜ ํฌ๊ธฐ N (4 ≤ N ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ N๊ฐœ ์ค„์—๋Š” ๊ฐ ์นธ์— ์ ํ˜€์ ธ ์žˆ๋Š” ์ˆ˜๊ฐ€ N๊ฐœ์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์นธ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 9๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋ฉฐ, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ์—๋Š” ํ•ญ์ƒ 0์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

๊ฐ€์žฅ ์™ผ์ชฝ ์œ„ ์นธ์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ์œผ๋กœ ๋ฌธ์ œ์˜ ๊ทœ์น™์— ๋งž๊ฒŒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋Š” 2^63-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.


์‹ค๋ฒ„1. dp ์ค‘์—๋Š” ์‰ฌ์šดํŽธ์ด๋‹ค

 

์œ ์˜์‚ฌํ•ญ!

๋‹ต์˜ ๋ฒ”์œ„๊ฐ€ 2^63-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฏ€๋กœ int ํ˜•์œผ๋กœ ํ’€๋ฉด ํ‹€๋ฆฐ๋‹ค ใ… ใ… 

int์˜ ๋ฒ”์œ„๋Š” ์ตœ๋Œ€ 2^31-1 ์ด๋ฏ€๋กœ, long long ํ˜•์œผ๋กœ ๊ณ ์ณ์ฃผ์—ˆ๋”๋‹ˆ ๋งž์•˜์Œ

 

main idea๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ dp๋กœ ๋ˆ„์ ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฒ˜์Œ์— ์•„์ด๋””์–ด๋Š” ๋– ์˜ฌ๋ฆฌ๊ธฐ ์‰ฌ์› ๋Š”๋ฐ, ๊ตฌํ˜„ ํ›„ ๋‹ต์ด ํ‹€๋ฆฌ๊ฒŒ ๋‚˜์™€์„œ ์–ด๋””๊ฐ€ ํ‹€๋ ธ๋Š”์ง€ ์ฐพ์•„๋ณด๋‹ˆ

๋งˆ์ง€๋ง‰์— map[i][j]๊ฐ€ 0์ผ๋•Œ๋„ map[i][j]์— ๋ณธ์ธ์˜ ๊ฐ’์ด ๊ณ„์† ๋ˆ„์ ๋˜์–ด์„œ ํ‹€๋ฆฐ ๊ฒƒ์ด์—ˆ๋‹ค

๊ทธ๋ž˜์„œ map[i][j] == 0์ผ๋•Œ continue;๊ตฌ๋ฌธ์„ ๋„ฃ์–ด์คฌ๋”๋‹ˆ ๋‹ต์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

 

 

 

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

#include <iostream>
#include <string>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n;
    int map[101][101]={0};
    long long cnt[101][101] = {0};
    cin >> n;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < n; ++j){
            cin >> map[i][j];
        }
    }
    cnt[0][0] = 1;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < n; ++j){
            if(map[i][j]==0) continue; // ๋งˆ์ง€๋ง‰์— ๊ณ„์† ๊ฐ’์ด ๋ˆ„์ ๋˜๋Š”๊ฑธ ๋ง‰๊ธฐ์œ„ํ•ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•„์š”
            int go = map[i][j];
            if(i + go < n) cnt[i + go][j] += cnt[i][j];
            if(j + go < n) cnt[i][j + go] += cnt[i][j];
        }
    }

    cout << cnt[n-1][n-1];
    return 0;
}

 

728x90
๋ฐ˜์‘ํ˜•