PS
[BOJ] Python 백준 가장 긴 바이토닉 부분 수열(11054)
1223v
2024. 11. 28. 18:29
https://www.acmicpc.net/problem/11054
부분 수열 시리즈 문제이다. 당연히 dp 문제이다. 하지만 추가로 조건이
증가하는 부분수열 + 감소하는 부분 수열을 더해서 가장 긴 부분 수열을 찾는 것이다.
import sys
input = sys.stdin.readline
N = int(input())
s = list(map(int,input().split()))
reverse_s = s[::-1]
dp = [1] * N
reverse_dp = [1] * N
for i in range(N):
for j in range(i):
if s[j] < s[i]:
dp[i] = max(dp[i], dp[j] + 1)
if reverse_s[j] < reverse_s[i]:
reverse_dp[i] = max(reverse_dp[i], reverse_dp[j]+1)
result = []
for i in range(N):
result.append(dp[i] + reverse_dp[N-i-1] - 1)
print(max(result))
회고.
반대로 된 배열을 만들어 하나의 for문으로 하는 것은 좋았으나, 거꾸로 만든 배열을 증가하는 부분수열 + 감소하는 부분 수열 하는 과정에서 다시금 N-i-1을 해주므로써, 정상 배열 방향처럼 맞춰줬어야 했는데 안했다...
또한, 증가하는 부분수열 + 감소하는 부분 수열을 하는 과정에서 중앙에 있는 값은 2번 더해졌으므로 1번 빼줬어야 했는데 안했다....
아직 다중 조건을 따는 부분이 미흡한거 같다,...