요번 문제는 해결을 하지 못하였고 시간초과가 발생하였습니다. 일단 코드를 공유하고 해결하면 다시 올리도록 하겠습니다.
문제
n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 대나무를 먹는다. 그런데 단 조건이 있다. 이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다. 만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다(-_-)
이 판다의 사육사는 이런 판다를 대나무 숲에 풀어 놓아야 하는데, 어떤 지점에 처음에 풀어 놓아야 하고, 어떤 곳으로 이동을 시켜야 둘 다 소중한 생명이지만 판다가 최대한 오래 살 수 있는지 고민에 빠져 있다. 우리의 임무는 이 사육사를 도와주는 것이다. n*n 크기의 대나무 숲이 주어져 있을 때, 이 판다가 최대한 오래 살려면 어떤 경로를 통하여 움직여야 하는지 구하여라.
입력
첫째 줄에 대나무 숲의 크기 n(1 ≤ n ≤ 500)이 주어진다. 그리고 둘째 줄부터 n+1번째 줄까지 대나무 숲의 정보가 주어진다. 대나무 숲의 정보는 공백을 사이로 두고 각 지역의 대나무의 양이 정수 값으로 주어진다. 대나무의 양은 1,000,000보다 작거나 같은 자연수이다.
코드
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#include<iostream>
#include<queue>
#include<algorithm>
#include<memory.h>
using namespace std;
struct info{
int x;
int y;
int day;
};
int N;
int ans;
int map[502][502];
int visited[501][501];
int px[4] = { 0,1,0,-1 };
int py[4] = { 1,0,-1,0 };
int temp_ans;
queue<info>qq;
queue<info>q;
void printt() {
for (int y = 1; y <= N; y++) {
for (int x = 1; x <= N; x++) {
cout << visited[y][x] << " ";
}
cout << endl;
}
cout << endl;
}
//void bfs(int x, int y) { //시간초과
// while (!qq.empty()) {
// visited[qq.front().y][qq.front().x] = false;
// qq.pop();
// }
// temp_ans = 0;
// info i;
// i.x = x; i.y = y; i.day = 1;
// q.push(i);
// cout << "시작점 :" << y << "," << x << endl;
// while (!q.empty()) {
// int X = q.front().x;
// int Y = q.front().y;
// int day = q.front().day;
// visited[Y][X] = true;
// //cout << Y << "," << X << ","<<day<<endl;
// printt();
// q.pop();
// temp_ans = max(temp_ans, day);
// for (int i = 0; i < 4; i++) {
// int nx = X + px[i];
// int ny = Y + py[i];
// if (visited[ny][nx])continue;
// if (ny <= 0 || ny > N || nx <= 0 || nx > N)continue;
// if (map[Y][X] >= map[ny][nx]) continue;
// info ni;
// ni.x = nx; ni.y = ny; ni.day = day + 1;
// q.push(ni);
// visited[ny][nx] = true;
// qq.push(ni);
// }
// }
// visited[y][x] = false;
// ans = max(temp_ans, ans);
//}
void dfs(int x, int y) {
int v = 0;
//cout << y << "," << x << "," << cnt << endl;
for (int i = 0; i < 4; i++) {
int nx = x + px[i];
int ny = y + py[i];
if (ny <= 0 || ny > N || nx <= 0 || nx > N)continue;
if (map[y][x] >= map[ny][nx]) continue;
dfs(nx, ny);
if (v < visited[ny][nx]) v = visited[ny][nx];
}
visited[y][x] = v + 1;
ans = max(ans, visited[y][x]);
}
int main() {
cin >> N;
for (int y = 1; y <= N; y++) {
for (int x = 1; x <= N; x++) {
cin >> map[y][x];
}
}
ans = 0;
for (int y = 1; y <= N; y++)
for (int x = 1; x <= N; x++) {
//cout << "시작점 :" << y << "," << x << endl;
if (visited[y][x])continue;
dfs(x, y);
//printt();
//bfs(x, y);
}
cout << ans;
}
|
cs |
풀이
처음에는 bfs로 접근하여 시간초과가 발생하였고
dfs로 접근하여 풀었을때역시 시간초과가 발생하였습니다.
그리하여 dp로 접근하여 풀었는데 역시 시간초과가 발생하여 계속 고민중인 문제입니다.
조금만 더 고민해보도록 하겠습니다.
'알고리즘 문제풀기 > 백준' 카테고리의 다른 글
[백준][BOJ][C++][3055번] 탈출 (0) | 2021.03.24 |
---|---|
[백준][BOJ][C++][2573번] 빙산 (0) | 2021.03.23 |
[백준][BOJ][C++][1238번] 파티 (0) | 2021.03.19 |
[백준][BOJ][C++][1987번] 알파벳 (0) | 2021.03.18 |
[백준][BOJ][C++][1520번] 내리막 길 (0) | 2021.03.17 |