Algorithm/BOJ

욕심쟁이 판다 - 1937

jhg0406 2020. 2. 25. 20:18
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
//1937 - 욕심쟁이 판다
 
#include <iostream>
#include <vector>
using namespace std;
 
#define IMP -100000000
 
int N;
vector<vector<int>> arr;
vector<vector<int>> cache;
int xarr[4= {1-100};
int yarr[4= {001-1};
 
void init()
{
    cin >> N;
    arr = cache = vector<vector<int>>(N+2vector<int>(N+2));
    for(int i = 1; i<=N; ++i)
        for(int j = 1; j<=N; ++j)
        {
            cin >> arr[i][j];
            cache[i][j] = -1;
        }
    for(int i = 0; i<N+2++i)
        arr[0][i] = arr[i][0= arr[N+1][i] = arr[i][N+1= -1;
}
 
int dp(int x, int y)
{
    int& ret = cache[x][y];
    if(ret != -1)
        return ret;
    ret = 0;
    for(int i = 0; i<4++i)
        if(arr[x][y] < arr[x+xarr[i]][y+yarr[i]])
            ret = max(ret, dp(x+xarr[i], y+yarr[i]));
    return ++ret;
}
 
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0);
    init();
    int ans = IMP;
    for(int i = 1; i<=N; ++i)
        for(int j = 1; j<=N; ++j)
            ans = max(ans, dp(i, j));
    cout << ans;
}
cs

 

 

 

 

 

 

https://www.acmicpc.net/problem/1937

 

1937번: 욕심쟁이 판다

n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 대나무를 먹는다. 그런데 단 조건이 있다. 이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다. 만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다(-_-) 이

www.acmicpc.net

 

 

 

 

 

 

욕심쟁이 판다

DP문제 입니다. 더 큰쪽으로만 향하기 때문에 싸이클이 생기지 않습니다.