๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/DP

[๋ฐฑ์ค€]1520๋ฒˆ: ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

by syLim___ 2023. 2. 17.
728x90

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

 

1520๋ฒˆ: ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

์—ฌํ–‰์„ ๋– ๋‚œ ์„ธ์ค€์ด๋Š” ์ง€๋„๋ฅผ ํ•˜๋‚˜ ๊ตฌํ•˜์˜€๋‹ค. ์ด ์ง€๋„๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋ฉฐ ์—ฌ๋Ÿฌ ์นธ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์€ ํ•œ ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ๊ฐ ์นธ์—๋Š” ๊ทธ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ์“ฐ์—ฌ ์žˆ์œผ

www.acmicpc.net

์ด๊ฑฐ... ๋‚˜ํ•œํ…Œ๋Š” ๋„ˆ๋ฌด ์–ด๋ ค์› ๋‹ค...

 

์˜ค๋ž˜ ๊ณ ๋ฏผํ•˜๊ณ  ํžŒํŠธ ๋ด๋„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๋‹ค๋ฅธ ๋ถ„๋“ค ํ’€์ด๋ฅผ ์•„์ฃผ ๋งŽ์ด ์ฐธ๊ณ ํ–ˆ์Œ

 

๋‹ค๋ฅธ ๋ถ„๋“ค ํ’€์ด ๋ณผ๋•Œ์—๋„ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ข€ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹น...ใ…Ž

 


 

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์ด ๋ฌธ์ œ๋Š” dfs + dp ๋ฌธ์ œ๋‹ค

 

 

ํ˜„์žฌ ์นธ์œผ๋กœ๋ถ€ํ„ฐ ๋„์ฐฉ์ ๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ˆ˜๋Š” ์ธ์ ‘ํ•œ ์นธ(์ƒํ•˜์ขŒ์šฐ, ์ตœ๋Œ€ 4๊ฐœ)์„ ์‹œ์ž‘์ ์œผ๋กœ ๋„์ฐฉ์ ๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ˆ˜๋“ค์˜ ํ•ฉ์ด๋‹ค.

 

๊ฐ ์นธ์„ ์‹œ์ž‘์ ์œผ๋กœ ๋„์ฐฉ์ ๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” dfs๋กœ ํ™•์ธํ•œ๋‹ค.

ํŠน์ • ์นธ์„ ์‹œ์ž‘์ ์œผ๋กœ dfs๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ, ํƒ์ƒ‰์€ (1)๋”์ด์ƒ ๋ฐฉ๋ฌธํ•  ์นธ์ด ์—†๊ฑฐ๋‚˜, (2)๋„์ฐฉ์ ์— ๋„๋‹ฌํ•  ๊ฒฝ์šฐ ์ข…๋ฃŒ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ (0,0)์„ ์‹œ์ž‘์ ์œผ๋กœ dfs๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ํ’€ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.


๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฌธ์ œ์—์„œ๋Š” ๋‹จ์ˆœ dfs๋กœ ํ’€๋ฉด ์‹œ๊ฐ„์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚ ๊ฑฐ๋‹ค!!

 

๊ทธ๋ž˜์„œ ๋™์  ๊ณ„ํš๋ฒ•์„ ์ด์šฉํ•ด์•ผํ•œ๋‹ค.

๋ชจ๋“  ์นธ์—์„œ dfs๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค๋ฉด,

ํƒ์ƒ‰ ์ค‘ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์นธ์„ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ํƒ์ƒ‰์„ ์ƒˆ๋กœ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , ์ €์žฅํ•ด๋‘” ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋”ฐ

 


#include <iostream>
int m,n;
int graph[500][500]; //์ง€๋„
int dp[500][500]; //๊ฒฝ๋กœ ์ˆ˜ ์ €์žฅํ•  ๋ฐฐ์—ด

int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

using namespace std;

int dfs(int x, int y){
    if(x==m-1 && y==n-1) return 1; //๋„์ฐฉ์ ์— ๋„๋‹ฌ
    if(dp[x][y]!=-1) return dp[x][y]; //๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์ €์žฅ๋œ ๊ฐ’์„ ๋ฆฌํ„ด
    
    dp[x][y]=0; //๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    
    for(int i=0;i<4;i++){ //์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ ๋ฐฉ๋ฌธ
        int nextX=x+dx[i];
        int nextY=y+dy[i];
        if(nextX>=0 && nextX<m && nextY>=0 && nextY<n){ //x,y ๋ฒ”์œ„ ์ฒดํฌ
            if(graph[x][y] > graph[nextX][nextY]){ //๋†’์ด ์กฐ๊ฑด ์ฒดํฌ
                dp[x][y] += dfs(nextX,nextY); //ํƒ์ƒ‰ ์ˆ˜ํ–‰
            }
        }
    }

    return dp[x][y];
    
}

int main()
{
    cin>>m>>n;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin>>graph[i][j];
            dp[i][j]=-1; //๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋ชจ๋‘ -1๋กœ ์ดˆ๊ธฐํ™”
        }
    }
    
    cout<<dfs(0,0);

    return 0;
}
728x90