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

[BOJ][C++] ๋ฐฑ์ค€ 1890๋ฒˆ: ์ ํ”„

์„ ๋‹ฌ 2023. 11. 14. 12:08
๋ฐ˜์‘ํ˜•

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

 

1890๋ฒˆ: ์ ํ”„

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

www.acmicpc.net

 

๋ฌธ์ œ

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

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

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

์ž…๋ ฅ

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

์ถœ๋ ฅ

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

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

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<vector<int>> v(n, vector<int>(n));
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            cin >> v[i][j];
        }
    }
    
    vector<vector<long long>> dp(n, vector<long long>(n,0));
    dp[0][0] = 1;
    int value;
    long long count;
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            value = v[i][j];
            count = dp[i][j];
            if(count==0 || (i==n-1 && j==n-1)) 
                continue;
            if(i+value<n) {
                dp[i+value][j] += count;
            }
            if(j+value<n) {
                dp[i][j+value] += count;
            }
        }
    }
    
    cout << dp[n-1][n-1];
}
๋ฐ˜์‘ํ˜•