728x90
욕심쟁이 판다.
https://www.acmicpc.net/problem/1937
<문제>
<코드>
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 64 65 66 67 | //gcc 4.9.3 #include <stdio.h> int map[501][501]; int visit[501][501]; int N; int max=0; int vectX[4] = {0,1,0,-1}; int vectY[4] = {1,0,-1,0}; void dfsMap(int y, int x){ int nextX,nextY; int value=0; for(int i=0;i<4;i++) { nextX=x+vectX[i]; nextY=y+vectY[i]; if(nextX>=N || nextX<0 || nextY>=N || nextY<0) continue; if(map[nextY][nextX] < map[y][x]) { if(visit[nextY][nextX]==0) dfsMap(nextY,nextX); if(value<visit[nextY][nextX]) value=visit[nextY][nextX]; } } visit[y][x] = value+1; if(max<visit[y][x]) max=visit[y][x]; } int main(void) { 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++) { if(visit[i][j]==0) dfsMap(i,j); } } printf("%d\n",max); return 0; } | cs |
<푸는 요령>
1. 중요한건 깊이 재귀로 깊이 우선 탐색을 하여서 탐색한 것들을 체크하는 것이다.
2. 그렇다면 N * M 맵에서 탐색하는 경우는 N * M 크기 방법밖에 나오지 않기 때문이다.
3. visit[][] 배열의 초기를 0으로 잡고 1이상의 수는 체크한 것이기 때문에 탐색할 필요가 없는 것이다.
4. 즉 이렇게 탐색한것중 가장 큰 숫자가 가장 긴 것이다.
728x90
'Algorithm > DP(동적 계획법)' 카테고리의 다른 글
[백준][11060번][DP] 점프 점프 (0) | 2016.10.05 |
---|---|
[백준][9084번][DP] 동전 (0) | 2016.10.05 |
[백준][2096번][DP] 내려가기 (0) | 2016.10.01 |
[백준][2294번][DP] 동전 2 (0) | 2016.09.30 |
[백준][1509번][DP] 팰린드롬 분할 (0) | 2016.04.15 |
댓글