์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 11053 ๐Ÿฅˆ] ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

1eehyunji 2023. 8. 12. 20:03

๋ฌธ์ œ

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋Š” 4์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 1,000)

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

import sys

n=int(sys.stdin.readline())
numbers=list(map(int, sys.stdin.readline().split(' ')))

dp=[1]*n
for idx in range(n):
    for j in range(idx):
        if numbers[j]<numbers[idx]:
            dp[idx]=max(dp[idx], dp[j]+1)

print(max(dp))
  • LIS(Longest Increasing Subsequence) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.
  • ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„์ˆ˜์—ด์ด๋ž€, ์›์†Œ๊ฐ€ n๊ฐœ์ธ ๋ฐฐ์—ด์˜ ์ผ๋ถ€ ์›์†Œ๋ฅผ ๊ณจ๋ผ๋‚ด์„œ ๋งŒ๋“  ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘, ๊ฐ ์›์†Œ๊ฐ€ ์ด์ „ ์›์†Œ๋ณด๋‹ค ํฌ๋‹ค๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ณ , ๊ทธ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€์ธ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด๋‹ค.
  • dp๋ฅผ ์ด์šฉํ•ด์„œ idx๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, dp[A]=B ๋ผ๋Š” ๋œป์€ A๋ฒˆ ์ธ๋ฑ์Šค ์š”์†Œ๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ์˜ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” B๋ผ๋Š” ๋œป์ด๋‹ค. 
  • 0๋ฒˆ์งธ๋ถ€ํ„ฐ n-1๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๋ฉด์„œ idx๋ฒˆ ์ˆซ์ž ์•ž์— ์žˆ๋Š” ์ˆซ์ž๋“ค ์ค‘ idx๋ฒˆ ์ˆซ์ž๋ณด๋‹ค ์ž‘์€ ์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ๊ทธ ์ˆซ์ž์˜ dp๊ฐ’+1๊ณผ dp[idx] ์ค‘ ๋” ํฐ ๊ฐ’์„ dp[idx]์— ๋„ฃ์–ด์ฃผ๋Š” ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์ด ๊ณผ์ •์„ ๋ฌธ์ œ์˜ ์˜ˆ์ œ 1๋ฒˆ์œผ๋กœ ํ’€์ดํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.