#include <stdio.h>


#define MAX(x,y) x>y?x:y

int arr[502][502], dp[502][502];

int n;


int dfs(int y, int x)

{

    if(dp[y][x]) return dp[y][x];

    dp[y][x] = dp[y][x] > 1 ? dp[y][x] : 1;

    

    int val = 1, max = 1;

    if(arr[y-1][x] > arr[y][x])

        val = dp[y][x] + dfs(y-1, x), max = MAX(max, val);

    if(arr[y][x+1] > arr[y][x])

        val = dp[y][x] + dfs(y, x+1), max = MAX(max, val);

    if(arr[y+1][x] > arr[y][x])

        val = dp[y][x] + dfs(y+1, x), max = MAX(max, val);

    if(arr[y][x-1] > arr[y][x])

        val = dp[y][x] + dfs(y, x-1), max = MAX(max, val);

    

    dp[y][x] = max;

    return max;

}


int main()

{

    int res=0;

    

    scanf("%d", &n);

    for(int i=1; i<=n; i++)

        for(int j=1; j<=n; j++)

            scanf("%d", &arr[i][j]);

    

    for(int i=1; i<=n; i++)

    {

        for(int j=1; j<=n; j++)

        {

            int val = dfs(i, j);

            dp[i][j] = MAX(dp[i][j], val);

        }

    }

    for(int i=1; i<=n; i++)

        for(int j=1; j<=n; j++)

            res = MAX(res, dp[i][j]);

    printf("%d", res);

}


DFS + 메모이제이션 활용

해석은 알아서

코드 존나 못짜서 드러워도 이해좀 ㅎ