DP + DFS
https://www.acmicpc.net/problem/1937
1937번: 욕심쟁이 판다
n × n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에
www.acmicpc.net
dp[x][y] 를
(x,y)에서 판다가 먹기 시작할때 지날수 있는 위치의 최대값으로 만들어주면
쉽게 해결할 수 있다.
이 dp[x][y]를 구하기 위해서는 주변 네칸을 탐색 후 dp[nx][ny]가 구해지지 않았다면 이 또한 구해주는
DFS를 이용하면 AC를 받을 수 있다.
#include <bits/stdc++.h>
using namespace std;
int dx[] = {-1, 1, 0, 0};
int dy[] = { 0, 0,-1, 1};
int arr[567][567] = {0};
int dp[567][567] = {0};
int n;
int f(int x, int y){
if(dp[x][y] != 0) return dp[x][y];
dp[x][y] = 1;
for(int i=0; i<4; i++){
int nx = x+dx[i];
int ny = y+dy[i];
if(0>nx || 0>ny || nx>=n || ny>=n) continue;
if(arr[nx][ny] > arr[x][y]){
dp[x][y] = max(f(nx,ny)+1, dp[x][y]);
}
}
return dp[x][y];
}
int main(){
ios::sync_with_stdio(false);
cout.tie(NULL);
cin.tie(NULL);
cin >> n;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cin >> arr[i][j];
}
}
int ans = 0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
ans = max(ans, f(i,j));
}
}
cout << ans;
return 0;
}
반응형