๐ข ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด
1. ๋ฌธ์ ๋งํฌ
๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด
2. ์ฝ๋
PyPy3ย
111312KB
2068ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
"""
[11054] ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด
๐ ๋ฌธ์
์์ด S๊ฐ ์ด๋ค ์ Sk๋ฅผ ๊ธฐ์ค์ผ๋ก S1 < S2 < ... Sk-1 < Sk > Sk+1 > ... SN-1 > SN์ ๋ง์กฑํ๋ค๋ฉด,
๊ทธ ์์ด์ ๋ฐ์ดํ ๋ ์์ด์ด๋ผ๊ณ ํ๋ค.
์๋ฅผ ๋ค์ด, {10, 20, 30, 25, 20}๊ณผ {10, 20, 30, 40}, {50, 40, 25, 10} ์ ๋ฐ์ดํ ๋ ์์ด์ด์ง๋ง,
{1, 2, 3, 2, 1, 2, 3, 2, 1}๊ณผ {10, 20, 30, 40, 20, 30} ์ ๋ฐ์ดํ ๋ ์์ด์ด ์๋๋ค.
์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ์์ด์ ๋ถ๋ถ ์์ด ์ค ๋ฐ์ดํ ๋ ์์ด์ด๋ฉด์ ๊ฐ์ฅ ๊ธด ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ ์
๋ ฅ
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N์ด ์ฃผ์ด์ง๊ณ ,
๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 โค N โค 1,000, 1 โค Ai โค 1,000)
๐ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์์ด A์ ๋ถ๋ถ ์์ด ์ค์์ ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
"""
# ์์ด A์ ํฌ๊ธฐ N
n = int(input())
# ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai
array = list(map(int, input().split()))
dpUp = [1 for _ in range(n)]
dpDown = [1 for _ in range(n)]
for k in range(n):
# ์ ๋ฐฉํฅ
for i in range(k):
for j in range(i):
if array[j] < array[i]:
# ์ด์ ์์์ ํฐ์ง๋ฅผ ๋น๊ตํด์, ํฌ๋ฉด 1 ๋ํ๊ธฐ
dpUp[i] = max(dpUp[i], dpUp[j]+1)
# ์ญ ๋ฐฉํฅ
for i in range(n-1, k-1, -1):
for j in range(i+1, n):
if array[i] > array[j]:
# ์ด์ ์์์ ํฐ์ง๋ฅผ ๋น๊ตํด์, ํฌ๋ฉด 1 ๋ํ๊ธฐ
dpDown[i] = max(dpDown[i], dpDown[j]+1)
dp = [1 for _ in range(n)]
for i in range(n):
dp[i] = dpUp[i] + dpDown[i]
print(max(dp)-1)
3. ํด์ค
- ์๋ฐฉํฅ, ์ญ๋ฐฉํฅ ๋๋ก ์ด์ ์์๋ณด๋ค ํฌ๋ฉด dp + 1 ํ๋ค
- ๊ฒน์น๋๊ฒ ์์ผ๋ฏ๋ก ๊ฐ์ฅ ํฐ ์์์์ -1 ๋นผ์ค๋ค (์ค๋ณต๋์์ผ๋ฏ๋ก)
This post is licensed under CC BY 4.0 by the author.