티스토리 뷰

Algorithm/BOJ

1937 욕심쟁이 판다

henry1214 2018. 3. 5. 02:29

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



판다가 대나무를 먹으면서 이동한다. 단, 현재 위치의 대나무보다 더 많은 대나무가 있는 쪽으로만 이동한다. 이 때 판다가 이동할 수 있는 최대 길이를 찾는 문제이다. 먼저 DFS를 이용한 완전 탐색을 생각해 볼 수 있다. 그러나 N이 최대일 때, 500*500의 map에서 모든 경로를 다 탐색하면 시간 초과가 나게 된다. 이 때 다이나믹을 이용해서 가지치기를 한다. d[x][y] = 판다가 (x,y)까지 올 수 있는 최대 길이라고 정의하자. 경로를 탐색하다가 d[x][y]가 지금까지 온 경로의 길이 k보다 크다면 이미 다른 경로로 왔을 때의 최대 길이가 존재한다는 뜻이다. 이 경우 더 이상 탐색하는 것이 의미가 없으므로 탐색을 종료한다. 즉, DFS+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
#include <cstdio>
#include <algorithm>
using namespace std;
 
int n,map[500][500],d[500][500],ans;
int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};
 
void dfs(int x,int y,int k)
{
    if(d[x][y]>k) return;
    ans=max(ans,d[x][y]=k);
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i],ny=y+dy[i];
        if(nx<0 || nx>=|| ny<0 || ny>=|| map[x][y]>=map[nx][ny])
            continue;
        dfs(nx,ny,k+1);
    }
}
 
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++for(int j=0;j<n;j++)
        scanf("%d",&map[i][j]);
    for(int i=0;i<n;i++for(int j=0;j<n;j++)
        dfs(i,j,1);
    printf("%d",ans);
    return 0;
}
cs


'Algorithm > BOJ' 카테고리의 다른 글

15501 부당한 퍼즐  (0) 2018.03.05
14500 테트로미노  (0) 2018.03.05
8006 Connections  (0) 2018.03.05
1854 K번째 최단경로 찾기  (0) 2018.03.05
2667 단지번호 붙이기  (0) 2018.03.03
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday