알고리즘/BOJ

백준 1937번 욕심쟁이 판다

꾸준함. 2018. 3. 1. 17:30

문제 링크입니다: https://www.acmicpc.net/problem/1937

'프로그래밍 대회에서 배우는 알고리즘 문제해결전략' 책에서 익힌 메모이제이션을 통해 문제를 해결했습니다.

문제의 조건을 코드로 잘 옮기는 것이 관건이였습니다.


/*

n*n의 크기의 대나무 숲이 있다.욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다.

그리고 그 곳의 대나무를 다 먹어 치우면 상, , , 우 중 한 곳으로 이동을 한다.

그리고 또 그곳에서 대나무를 먹는다.그런데 단 조건이 있다.

이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다.

만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다(-_ - )

이 판다의 사육사는 이런 판다를 대나무 숲에 풀어 놓아야 하는데, 어떤 지점에 처음에 풀어 놓아야 하고,

어떤 곳으로 이동을 시켜야 둘 다 소중한 생명이지만 판다가 최대한 오래 살 수 있는지 고민에 빠져 있다.

우리의 임무는 이 사육사를 도와주는 것이다.n*n 크기의 대나무 숲이 주어져 있을 때,

이 판다가 최대한 오래 살려면 어떤 경로를 통하여 움직여야 하는지 구하여라.

*/

#include <iostream>

#include <cstring> //memset

using namespace std;

 

const int MAX = 501;

 

int N;

int bamboo[MAX][MAX];

int cache[MAX][MAX];

 

int maxDays(int y, int x)

{

        int &result = cache[y][x];

        if (result != -1)

               return result;

        result = 1; //첫날

        int temp;

        //

        if (y - 1 >= 0 && bamboo[y][x] < bamboo[y-1][x])

        {

               temp = 1 + maxDays(y - 1, x);

               if (temp > result)

                       result = temp;

        }

        //

        if (y + 1 < N && bamboo[y][x] < bamboo[y+1][x])

        {

               temp = 1 + maxDays(y + 1, x);

               if (temp > result)

                       result = temp;

        }

        //

        if (x + 1 < N && bamboo[y][x] < bamboo[y][x+1])

        {

               temp = 1 + maxDays(y, x + 1);

               if (temp > result)

                       result = temp;

        }

        //

        if (x - 1 >= 0 && bamboo[y][x] < bamboo[y][x-1])

        {

               temp = 1 + maxDays(y, x - 1);

               if (temp > result)

                       result = temp;

        }

        return result;

}

 

int main(void)

{

        cin >> N;

        if (N < 1 || N >= MAX)

               exit(-1);

       

        //대나무 숲 입력

        for (int i = 0; i < N; i++)

               for (int j = 0; j < N; j++)

                       cin >> bamboo[i][j];

 

        memset(cache, -1, sizeof(cache));

        int result = 0;

        for(int i=0; i<N; i++)

               for (int j = 0; j < N; j++)

               {

                       //(i, j)에서 먹기 시작할 때 최대 일 수

                       int temp = maxDays(i, j);

                       //현재 최대 일수보다 높게 나왔다면 초기화

                       if (result < temp)

                              result = temp;

               }

        cout << result << endl;

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 11051번 이항 계수 2  (0) 2018.03.01
백준 6359번 만취한 상범  (0) 2018.03.01
백준 1309번 동물원  (0) 2018.02.28
백준 1965번 상자넣기  (0) 2018.02.26
백준 2749번 피보나치 수 3  (0) 2018.02.25