백준 python 기록
백준 파이썬 11054 가장 긴 바이토닉 부분 수열
작지
2022. 1. 25. 13:57
https://www.acmicpc.net/problem/11054
11054번: 가장 긴 바이토닉 부분 수열
첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)
www.acmicpc.net
처음에는 늘어나는 부분 수열과 줄어드는 부분 수열을 한 dp배열에 전부 넣으려고 했지만
얼토당토 없는 결과 값이 나왔고 이 방법이 아닌 다른 방법을 생각해봤다.
차근차근 풀이를 했는데
일단 가장 긴 늘어나는 부분 수열을 구해보았는데.
(예시)
https://www.acmicpc.net/problem/11053
# n = 10
# s = [1 5 2 1 4 3 4 5 2 1]
n = int(input())
s = list(map(int,input().split()))
dp=[1]*n
for i in range(n):
for j in range(i):
if s[i] > s[j]:
dp[i] = max(dp[i],dp[j]+1)
print(dp) # [1, 2, 2, 1, 3, 3, 4, 5, 2, 1]
늘어나는 부분 수열 = [1, 2, 2, 1, 3, 3, 4, 5, 2, 1]
이 부분에서 역순으로 늘어나는 부분 수열을 따로 만들었고 그 수를 더해주었더니 생각했던 대로 값이 반환되었음.
# n = 10
# s = [1 5 2 1 4 3 4 5 2 1]
n = int(input())
s = list(map(int,input().split()))
s_2 = s[::-1]
dp=[1]*n
dp_2=[1]*n
for i in range(n):
for j in range(i):
if s[i] > s[j]:
dp[i] = max(dp[i],dp[j]+1)
if s_2[i] > s_2[j]:
dp_2[i] = max(dp_2[i],dp_2[j]+1)
dp_2 = dp_2[::-1]
answer = [0 for i in range(n)]
for i in range(n):
answer[i] = dp[i] + dp_2[i] - 1
print(max(answer))
#dp([1, 2, 2, 1, 3, 3, 4, 5, 2, 1])
#dp_2([1, 5, 2, 1, 4, 3, 3, 3, 2, 1])
그렇게 어렵지 않은 문제였고
예전에 이 분이 올려주신 글을 생각하며 풀이를 생각해냈습니다잉
가장 긴 증가하는 부분 수열(LIS) 완전 정복 - 백준 파이썬
최근 들어, 알고리즘에 재미를 붙였다. 백준 문제를 풀면 문제 난이도마다 티어가 올라가는 재밌는 사이트(solved.ac)가 생겨서 뭔가 동기 부여되는 것 같다. 언어는 python을 사용하고 있다. (취준
seohyun0120.tistory.com