Outdated/Algorithm Solution

[BOJ] 1937번 욕심쟁이 판다

해달 2020. 5. 11. 08:00

복기

-


코드

  • C++ 17


#include <stdio.h>

 

#define Max(lhs, rhs) ((lhs) > (rhs) ? (lhs) : (rhs))

 

int N;

int Map[502][502];

int Memo[502][502]; // 각 좌표마다 며칠동안 생존 가능한지 메모이제이션한다.

 

int Search(int r, int c)

{

    if (Memo[r][c])

        return Memo[r][c];

 

    // 상

    if (Map[r - 1][c] > Map[r][c])

        Memo[r][c] = Max(Memo[r][c], Search(r - 1, c) + 1);

    // 하

    if (Map[r + 1][c] > Map[r][c])

        Memo[r][c] = Max(Memo[r][c], Search(r + 1, c) + 1);

    // 좌

    if (Map[r][c - 1] > Map[r][c])

        Memo[r][c] = Max(Memo[r][c], Search(r, c - 1) + 1);

    // 우

    if (Map[r][c + 1] > Map[r][c])

        Memo[r][c] = Max(Memo[r][c], Search(r, c + 1) + 1);

    

    return Memo[r][c];

}

 

int main()

{

    scanf("%d", &N);

    for (size_t r = 1; r <= N; r++) for (size_t c = 1; c <= N; c++)

        scanf("%d", &Map[r][c]);

 

    int ans = 0;

    for (size_t r = 1; r <= N; r++) for (size_t c = 1; c <= N; c++)

        ans = Max(ans, Search(r, c) + 1);

    

    printf("%d", ans);

}


  • C# 6.0


using System;

 

namespace Csharp

{

    class Program

    {

        static int N = 0;

        static int[,] Bamboo = new int[502, 502];

        static int[,] Memo = new int[502, 502];

 

        static void Main(string[] args)

        {

            N = Convert.ToInt32(Console.ReadLine());

            for (int r = 1; r <= N; r++)

            {

                var inputs = Console.ReadLine().Split();

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

                    Bamboo[r, c + 1] = Convert.ToInt32(inputs[c]);

            }

 

            int ans = 0;

            for (int r = 1; r <= N; r++)

            {

                for (int c = 1; c <= N; c++)

                    ans = Math.Max(ans, Search(r, c) + 1);

            }

 

            Console.Write(ans);

        }

 

        static int Search(int r, int c)

        {

            if (0 != Memo[r, c])

                return Memo[r, c];

 

            if (Bamboo[r, c] < Bamboo[r - 1, c])

                Memo[r, c] = Math.Max(Memo[r, c], Search(r - 1, c) + 1);

            if (Bamboo[r, c] < Bamboo[r + 1, c])

                Memo[r, c] = Math.Max(Memo[r, c], Search(r + 1, c) + 1);

            if (Bamboo[r, c] < Bamboo[r, c - 1])

                Memo[r, c] = Math.Max(Memo[r, c], Search(r, c - 1) + 1);

            if (Bamboo[r, c] < Bamboo[r, c + 1])

                Memo[r, c] = Math.Max(Memo[r, c], Search(r, c + 1) + 1);

 

            return Memo[r, c];

        }

    }

}


  • Python 3


from sys import stdin, setrecursionlimit

setrecursionlimit(1000000)

input = stdin.readline

 

N = int(input())

Map = [ list(map(int, input().split())) for i in range(N) ]

Memo = [ [0] * N for i in range(N) ]

 

def Max(lhs, rhs):

    return lhs if lhs > rhs else rhs

 

def Search(r, c):

    global N, Map, Memo

 

    if Memo[r][c]:

        return Memo[r][c]

 

    if r > 0 and Map[r - 1][c] > Map[r][c]:

        Memo[r][c] = Max(Memo[r][c], Search(r - 1, c) + 1

    if r < N - 1 and Map[r + 1][c] > Map[r][c]:

        Memo[r][c] = Max(Memo[r][c], Search(r + 1, c) + 1)

    if c > 0 and Map[r][c - 1] > Map[r][c]:

        Memo[r][c] = Max(Memo[r][c], Search(r, c - 1) + 1)

    if c < N - 1 and Map[r][c + 1] > Map[r][c]:

        Memo[r][c] = Max(Memo[r][c], Search(r, c + 1) + 1)

 

    return Memo[r][c]

 

ans = 0

for r in range(N):

    for c in range(N):

        ans = Max(ans, Search(r, c) + 1)

 

print(ans)


'Outdated > Algorithm Solution' 카테고리의 다른 글

[BOJ] 1437번 수 분해  (0) 2020.05.18
[BOJ] 1931번 회의실 배정  (0) 2020.05.11
[BOJ] 1799번 비숍  (0) 2020.05.04
[BOJ] 2661번 좋은 수열  (0) 2020.05.04
[BOJ] 6581번 HTML  (0) 2020.04.27