728x90
반응형
https://www.acmicpc.net/problem/11054
11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
가장 긴 바이 토닉 부분 수열 문제다.
가장 긴 증가하는 부분 수열에서 감소가 추가된 것이다.
따라서 가장 긴 증가하는 부분 수열, 즉 LIS를 찾아준 다음에 뒤에서부터 다시 LIS를 찾아준다.
이렇게 나온 두개의 inc 배열과 dec 배열을 합친 다음에 1을 빼준다.
왜 1을 빼주냐면 가장 큰 값 즉 증감이 변하는 부분의 값이 두 번 들어갔기 때문이다.
합쳐서 나온 리스트에서 가장 큰 값을 찾아주면 그게 정답이다.
import sys
n = int(sys.stdin.readline())
arr = list(map(int,sys.stdin.readline().split()))
inc_dp = [1 for _ in range(n+1)]
dec_dp = [1 for _ in range(n+1)]
inc_dp[0] = 1
dec_dp[0] = 1
for i in range(1,n):
for j in range(i):
if arr[j] < arr[i] and inc_dp[j]+1 > inc_dp[i]:
inc_dp[i] = inc_dp[j]+1
for i in range(n-1,-1,-1):
for j in range(n-1,i,-1):
if arr[j] < arr[i] and dec_dp[j]+1 > dec_dp[i]:
dec_dp[i] = dec_dp[j]+1
for i in range(n):
inc_dp[i] = inc_dp[i] + dec_dp[i] - 1
print(max(inc_dp))
https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
이 문제를 두번 반복한다고 보면 된다.
LIS를 제대로 이해했다면 아주 쉬운 문제
2 * O(NlogN) 으로 해결 가능
728x90
반응형
'Algorithm & Data Structure' 카테고리의 다른 글
백준 - 1717번(유니온 파인드, 재귀, 집합) (0) | 2022.08.16 |
---|---|
백준 - 14002번(DP, LIS) (0) | 2022.08.15 |
백준 - 9663번(백트래킹, N-Queen) (0) | 2022.08.15 |
백준 - 2638번(BFS,구현) (0) | 2022.08.14 |
백준 - 14500번(테트로미노,구현,브루트포스) (0) | 2022.08.14 |