๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด
๋ญ ๊ตฌํจ?
์์ด ํ๋ ์ฃผ๊ณ , ์ฆ๊ฐํ๋ค๊ฐ ๊ฐ์ํ๋ ํ๋ฆ ์ค์ ์ ์ผ ๊ธด ๊ฑฐ ํ๋๋ง ์ฐพ์ผ๋ฉด ๋จ. ์ ๋ถ ์ฐพ๋ ๊ฑฐ ์๋.
์์ด๋์ด
๋ถ๋ถ ์์ด ์ ๋ถ ๋ง๋ค๋ฉด ์๊ฐ ํฐ์ง. DP๋ก ๊ฐ๋ค.
- ์ผ์ชฝ์์ ์ค๋ LIS (๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด)
- ์ค๋ฅธ์ชฝ์์ ์ค๋ LDS (๊ฐ์ฅ ๊ธด ๊ฐ์ ๋ถ๋ถ ์์ด)
LIS๋ ๊ทธ๋๋ก, LDS๋ ์์ด ๋ค์ง์ด์ LIS์ฒ๋ผ ๋๋ฆฌ๊ณ ๋ค์ ๋ค์ง์ผ๋ฉด ๋จ.
ํต์ฌ ํ๋ฆ
- LIS[i] = i์์ ๋๋๋ ์ฆ๊ฐ ํ๋ฆ ๊ธธ์ด
- LDS[i] = i์์ ์์ํ๋ ๊ฐ์ ํ๋ฆ ๊ธธ์ด
- ๊ฐ ์ธ๋ฑ์ค์์ LIS + LDS - 1 ํด์ ์ต๋๊ฐ ์ฐพ์ผ๋ฉด ๋.
์ด๊ฒ ์ ๋ถ์. DP๋ ์ด์ค for๋ฌธ์ผ๋ก O(N²)๋ผ ๊ธธ์ด 1000์ด๋ฉด ์ถฉ๋ถํ ํต๊ณผํ๋ค.
# dp,LIS,LDS
import sys
input=sys.stdin.readline
def find_LIS(seq,n):
LIS=[1]*n
for i in range(n):
for j in range(i):
if seq[j]<seq[i]:
LIS[i]=max(LIS[i],LIS[j]+1)
return LIS
def main():
n=int(input())
seq=list(map(int,input().split()))
LIS=find_LIS(seq,n)
LDS=find_LIS(seq[::-1],n)[::-1]
result=0
for i in range(n):
length=LIS[i]+LDS[i]-1
result=max(result,length)
print(result)
if __name__=="__main__":
main()
๋ฐ์ํ
'๐ Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| โ BOJ 12851 - BFS ๊ฐ์ง ์ ๋์ (1) | 2025.07.11 |
|---|---|
| โ BOJ 17144 - ๋นก๊ตฌํ (2) | 2025.07.11 |
| โ BOJ 5639 - ์ ์ ์ํ -> ํ์ ์ํ (1) | 2025.07.07 |
| โ BOJ 9935 - ์คํ ํ์ฉ (0) | 2025.07.07 |
| โ BOJ 14626 - ISBN (0) | 2025.07.05 |