알고리즘/백준

[python/11054]가장 긴 바이토닉 부분 수열

(ㅇㅅㅎ) 2020. 5. 25. 20:46
728x90
반응형

https://www.acmicpc.net/problem/11054

 

11054번: 가장 긴 바이토닉 부분 수열

첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)

www.acmicpc.net

이 문제는 '가장 긴 증가하는 부분 수열' 문제를 응용한 것입니다.

 

https://onlab94.tistory.com/54

 

[python/11053]가장 긴 증가하는 부분 수열

https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50..

onlab94.tistory.com

'가장 긴 증가하는 부분 수열'의 경우는 배열을 정방향으로 한 번만 검사하여 증가하는 부분의 길이를 찾으면 됐었습니다.

하지만 이번 문제의 경우는 정방향으로 증가하는 부분의 길이를 구하고 역방향으로 증가하는 부분의 길이를 구한 후 값을 더하면 가장 긴 바이 토닉 부분 수열의 길이를 구할 수 있습니다.

여기서 주의할 점은 정방향과 역방향의 길이를 더한 후 최댓값이 중복되기 때문에 더한 값에서 -1을 해주어야 합니다.

 

코드를 보시려면 더보기를 클릭하시면 됩니다.

더보기

가장 긴 바이 토닉 부분 수열

 

def solve(N, LIS):
    dp = [1* N
    dp_increase = [1* N
    dp_decrease = [1* N
    for i in range(N):
        for j in range(i):
            if LIS[i] > LIS[j]:
                dp_increase[i] = max(dp_increase[i], dp_increase[j] + 1)
 
    for i in range(N-1-1-1):
        for j in range(N-1, i, -1):
            if LIS[i] > LIS[j]:
                dp_decrease[i] = max(dp_decrease[i], dp_decrease[j] + 1)
        dp[i] = dp_increase[i] + dp_decrease[i]
 
    return max(dp) - 1
 
if __name__=='__main__':
    N = int(input())
    LIS = list(map(int, input().split()))
    print(solve(N, LIS))
 

 

반응형

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

[python/9498]시험 성적  (0) 2020.11.18
[python/1330] 두 수 비교하기  (0) 2020.11.17
[python/11053]가장 긴 증가하는 부분 수열  (0) 2020.04.29
[python/2156]포도주 시식  (0) 2020.04.27
[python/10844]쉬운 계단 수  (0) 2020.04.23