๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

โœ… BOJ 11054 - DP, LIS

by huis_log 2025. 7. 9.

๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด

๋ญ˜ ๊ตฌํ•จ?
์ˆ˜์—ด ํ•˜๋‚˜ ์ฃผ๊ณ , ์ฆ๊ฐ€ํ•˜๋‹ค๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ํ๋ฆ„ ์ค‘์— ์ œ์ผ ๊ธด ๊ฑฐ ํ•˜๋‚˜๋งŒ ์ฐพ์œผ๋ฉด ๋จ. ์ „๋ถ€ ์ฐพ๋Š” ๊ฑฐ ์•„๋‹˜.

์•„์ด๋””์–ด
๋ถ€๋ถ„ ์ˆ˜์—ด ์ „๋ถ€ ๋งŒ๋“ค๋ฉด ์‹œ๊ฐ„ ํ„ฐ์ง. 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()

 

๋ฐ˜์‘ํ˜•