1937번: 욕심쟁이 판다
n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서
www.acmicpc.net
풀이
1. 일단 기본적으로는 완전 탐색이지만
2. 만약 0이 아닌 값이 들어있으면 바로 리턴하는 DP방식!
3. 주위에 자기 값보다 큰 대나무 값이 있으면 '그 좌표의 DP 값 +1' 과 현재 '자기 DP 값' 비교!!
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
int map[501][501];
int dp[501][501] = { 0, };
int answer = 0;
int d_r[4] = { 1,-1,0,0 };
int d_c[4] = { 0,0,1,-1 };
int DP(int r, int c)
{
if (dp[r][c] != 0)//이미 지정 했으면
return dp[r][c];
dp[r][c] = 1; // 처음으로 1 지정!
for (int i = 0; i < 4; i++)
{
int new_r = r + d_r[i];
int new_c = c + d_c[i];
if (new_r < n && new_r >=0 && new_c <n && new_c >= 0)//이동할 곳이 지도 안이라면!!
{
if (map[new_r][new_c] > map[r][c])//새 좌표가 대나무가 더 많아야 이동 가능!!
{
dp[r][c] = max(dp[r][c], DP(new_r, new_c) + 1);
}
}
}
return dp[r][c];
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> map[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
answer = max(answer,DP(i, j));
}
cout << answer<<endl;
return 0;
}
후기
1. 이거도 내가 맨날 고생하는 DFS BFS 처럼 생겼지만 런타임 에러떠서 DP로 풀어야되는 문제다!
2. 이번에도 역시나 구글링했다!!
3. 하지만 쫌 자신감 생겼다 ㅎㅎ
'c++ > Baekjoon Online' 카테고리의 다른 글
백준 17371 : 게리맨더링 c++ (0) | 2020.09.24 |
---|---|
백준 17136 : 색종이 붙이기 C++ (0) | 2020.09.24 |
백준 10844 : 쉬운 계단 c++ (0) | 2020.09.22 |
백준 17070 파이프 옮기기 1 c++ (0) | 2020.09.13 |
백준 9205 : 맥주마시면서 걸어가기 c++ (0) | 2020.09.06 |