만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

최장 증가 부분 수열

시간 제한1초메모리 제한1024 MB

요약
N×N 정수 격자에서 왼쪽 위에서 오른쪽 아래까지 최단 경로로 지나간 수들이 만드는 가장 긴 증가 부분 수열의 길이를 구합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 행렬
정답자
아직 제출이 없습니다

문제

정휘는 정수로 이루어진 N×NN\times N 크기의 배열에서 가장 왼쪽 위 칸부터 가장 오른쪽 아래 칸까지 최단 경로로 이동하려고 한다. 칸에서 다른 칸으로 이동할 때는 변을 공유하는 칸으로만 이동할 수 있다.

정휘는 이동하면서 만난 정수들을 순서대로 모아 성현이에게 선물로 주려고 한다. 성현이는 증가하는 부분 수열의 길이가 긴 수열을 좋아하기 때문에, 정휘는 최장 증가 부분 수열의 길이가 최대가 되는 수열을 만들어 주려고 한다.

정휘는 문제를 만들어야 해서 경로를 찾을 여유가 없다. N×NN\times N 크기의 배열이 주어졌을 때, 만들 수 있는 수열 중 최장 증가 부분 수열의 길이의 최댓값을 대신 구해 보자.

입력

첫째 줄에 NN이 주어진다. (1≤N≤1001 \leq N \leq 100)

이어서 NN개의 줄에 각각 NN개의 정수가 공백으로 구분되어 주어진다. 각 정수는 11 이상 10 00010\,000 이하이다.

출력

최장 증가 부분 수열의 길이의 최댓값을 출력한다.

힌트

  • Python 사용자는 PyPy로 제출하는 것을 권장한다.
  • 부분 수열이란 주어진 수열에서 1개 이상의 원소를 골라 원래 순서대로 나열해서 얻은 수열을 말한다.
  • 증가하는 부분 수열이란 맨 처음 원소를 제외한 모든 원소가 바로 앞 원소보다 큰 수열을 말한다. 즉, 길이가 NN인 부분 수열 AA가 2≤i≤N2 \leq i \leq N인 모든 ii에 대해 Ai−1<AiA_{i-1} < A_i를 만족하면, AA는 증가하는 부분 수열이다.
  • 최장 증가 부분 수열이란 주어진 수열의 증가하는 부분 수열 중 길이가 가장 긴 것을 의미한다.

예제2

  1. 예제 1

    입력
    3
    1 2 3
    3 2 1
    3 4 5
    
    예상 출력
    4
    
  2. 예제 2

    입력
    3
    1 1 1
    1 1 1
    1 1 1
    
    예상 출력
    1