
n = int(input())
num = list(map(int,input().split()))
dp1 = [1] * n
dp2 = [0] * n
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp1[i] = max(dp1[i], dp1[j] + 1)
num.reverse()
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp2[i] = max(dp2[i], dp2[j] + 1)
dp2.reverse()
for i in range(n):
dp1[i] += dp2[i]
print(max(dp1))
답은 나오지만 지저분하게 푼 것 같아서 다시 한번 풀어봤다..
n = int(input())
num = list(map(int,input().split()))
dp1 = [1] * n
dp2 = [0] * n
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp1[i] = max(dp1[i], dp1[j] + 1)
if num[-(i+1)] > num[-(j+1)]:
dp2[-(i+1)] = max(dp2[-(i+1)], dp2[-(j+1)] + 1)
for i in range(n):
dp1[i] += dp2[i]
print(max(dp1))
n = int(input())
num = list(map(int,input().split()))
dp1 = [1] * n
dp2 = [0] * n
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp1[i] = max(dp1[i], dp1[j] + 1)
for ii in range(1,n+1):
for jj in range(1,ii):
if num[-ii] > num[-jj]:
dp2[-ii] = max(dp2[-ii], dp2[-jj] + 1)
dp1[-ii] += dp2[-ii]
print(max(dp1))
여러 방법으로 풀어보았는데 제일 위에 풀이가 가장 빠른 시간으로 통과한다.
n = int(input())
num = list(map(int,input().split()))
num_rvs = num[::-1]
dp1 = [1] * n
dp2 = [0] * n
for i in range(n):
for j in range(i):
if num[i] > num[j]:
dp1[i] = max(dp1[i], dp1[j] + 1)
if num_rvs[i] > num_rvs[j]:
dp2[i] = max(dp2[i], dp2[j] + 1)
for i in range(n):
dp1[i] += dp2[-(i+1)]
print(max(dp1))
다시 코드를 한번 정리하였는데, 배열을 거꾸로 한 것을 복제하여 푸는 것이 깔끔한 풀이법같다.
| [파이썬/python] 백준 21921번 : 블로그 (🥈3) (윈도우 슬라이딩) (0) | 2023.08.10 |
|---|---|
| [파이썬/python] 백준 10844번 : 쉬운 계단 수 (🥈1) (0) | 2023.07.05 |
| [파이썬/python] 백준 11053번 : 가장 긴 증가하는 부분 수열 (🥈2) (0) | 2023.07.05 |
| [파이썬/python] 프로그래머스 : 카드 뭉치(Lv.1) (0) | 2023.07.05 |
| [파이썬/python] 프로그래머스 : 모의고사 (Lv.1) (0) | 2023.07.05 |