Algorithm/BOJ

[백준 1937] 욕심쟁이 판다 C++

Henu 2021. 5. 1. 20:27
 

1937번: 욕심쟁이 판다

n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서

www.acmicpc.net

DFS + DP

dp[r][c]값 : 판다가 r, c에서 출발했을 때 최대로 살 수 있는 날을 저장

상하좌우로 움직이며 얻는 dp값들 중 최댓값을 현재 dp값으로 갱신한다

 

방문여부, 좌표별 최대 생존일의 메모이제이션을 통해 문제를 해결

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
 
using namespace std;
 
int N, Map[501][501], dp[501][501];
int dr[4= {-1100}, dc[4= {001-1};
bool visited[501][501= {false, };
 
void init(){
    cin >> N;
    for(int r = 0; r < N; r++){
        for(int c = 0; c < N; c++){
            cin >> Map[r][c];
            dp[r][c] = 1;
            visited[r][c] = false;
        }
    }
}
 
int find_bamboo(int row, int col){
    // 방문한 적이 있으면 해당 지점의 dp값을 구했다는 의미이므로 그 값을 리턴
    if(visited[row][col]){
        return dp[row][col];
    }
    
    visited[row][col] = true;
    
    int res = 1;
    for(int i = 0; i < 4; i++){
        int nr = row + dr[i];
        int nc = col + dc[i];
        if(nr >= 0 && nr < N && nc >= 0 && nc < N && (Map[nr][nc] > Map[row][col])){
            if(visited[nr][nc]){
                res = max(res, 1 + dp[nr][nc]);
            }
            else{
                res = max(res, 1 + find_bamboo(nr, nc));
            }
        }
    }
    
    // 최댓값을 dp에 저장하면서 리턴
    return dp[row][col] = res;
}
 
void solve(){
    int result = 1;
    for(int r = 0; r < N; r++){
        for(int c = 0; c < N; c++){
            result = max(result, find_bamboo(r, c));
        }
    }
    cout << result;
}
 
int main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    init();
    solve();
    
    return 0;
}
 
cs