만드는 중입니다

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

부분 수열 뒤집기

시간 제한2초메모리 제한512 MB

요약
길이 N인 배열에서 부분수열 하나를 뒤집은 뒤 얻을 수 있는 가장 긴 비감소 부분수열의 길이를 구한다.
난이도

어려움10점 중 8점

유형
동적 계획법, 배열, 투 포인터, 그리디
정답자
아직 제출이 없습니다

문제

농부 존은 사진을 찍으려고 소 NN마리를 한 줄로 세우고 있다 (1≤N≤501 \le N \le 50). 줄에서 ii번째 소의 키는 a(i)a(i)이다. 존은 키가 증가하는 긴 부분 수열이 줄 안에 있으면 보기 좋은 사진이 된다고 생각한다.

부분 수열은 인덱스 i1<i2<⋯<iki_1 < i_2 < \cdots < i_k에 있는 원소 a(i1),a(i2),…,a(ik)a(i_1), a(i_2), \ldots, a(i_k)를 고른 것이다. a(i1)≤a(i2)≤⋯≤a(ik)a(i_1) \le a(i_2) \le \cdots \le a(i_k)이면 이 부분 수열이 증가한다고 한다.

존은 증가하는 부분 수열이 길어지도록, 처음에 부분 수열 하나를 마음대로 골라 그 원소의 순서를 뒤집을 수 있다.

예를 들어 수열이 다음과 같다고 하자.

1 6 2 3 4 3 5 3 4

아래 표시한 원소를 골라 뒤집으면

1 6 2 3 4 3 5 3 4
  ^         ^ ^ ^

다음 수열이 된다.

1 4 2 3 4 3 3 5 6
  ^         ^ ^ ^

뒤집은 부분 수열은 원래 차지하던 인덱스를 그대로 쓰고, 나머지 원소는 바뀌지 않는다.

임의의 부분 수열을 한 번 뒤집을 수 있을 때, 증가하는 부분 수열의 최대 길이를 구하여라.

입력

첫째 줄에 NN이 주어진다. 다음 NN개의 줄에 a(1),…,a(N)a(1), \ldots, a(N)이 한 줄에 하나씩 주어진다. 각 값은 11 이상 5050 이하의 정수이다.

출력

부분 수열을 최대 한 번 뒤집은 뒤 얻을 수 있는 증가하는 부분 수열의 최대 길이를 출력한다. 뒤집지 않아도 된다.

예제1

  1. 예제 1

    입력
    9
    1
    2
    3
    9
    5
    6
    8
    7
    4
    
    예상 출력
    9