My Profile

김형훈

안녕하세요.
김형훈입니다.

백준 1937 욕심쟁이 판다

백준 1937 욕심쟁이 판다

2022년 11월 26일

2022년 11월 26일

cpp, 분할 정복, 탐색

문제

문제

문제

문제

예제 입력 1의 (3,3)에 대해 판다가 이동 가능한 경로는 다음과 같다.

이동 가능한 다음 경로마다 값이 최대인 경로를 더한다.

이때 시간의 단축을 위해 탐색이 완료된 경로는 값을 저장해준 뒤, 이후 해당 경로를 재탐색할 때 더이상 탐색을 진행하지 않고 값을 바로 return해주는 방식으로 진행한다.

코드

코드

#include <bits/stdc++.h>

using namespace std;

int n, ans;
int board[502][502];
int dist[502][502];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,-1,0,1};
int find_max(int x,int y)
{
  if (!dist[x][y])
  {
    //탐색하지 않은 구간만 탐색
    dist[x][y] = 1;
    int long_child = 0;
    for (int dir=0; dir<4; ++dir)
    {
      int nx = x + dx[dir];
      int ny = y + dy[dir];
      if(nx<0||ny<0||nx>=n||ny>=n) continue;
      if(board[nx][ny] <= board[x][y]) continue;
      //판다가 이동 가능한 경로 중 가장 긴 경로 선택
      long_child = max(long_child,find_max(nx,ny));
    }
    dist[x][y] += long_child;
  }
  ans = max(ans,dist[x][y]);
  return dist[x][y];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for(int i=0; i<n; ++i)
        for(int j=0; j<n; ++j)
            cin >> board[i][j];
    for(int i=0; i<n; ++i)
        for(int j=0; j<n; ++j)
            ans = max(ans,find_max(i,j));
    cout << ans;
}

결과

결과

Copyright © 2024 Hyunghoon Kim