๋ฐฑ์ค€ 11053 ํŒŒ์ด์ฌ

2022. 1. 18. 07:26ใ†๐Ÿ”ฑ Algorithm/DP

https://www.acmicpc.net/problem/11053

 

11053๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด

www.acmicpc.net

 

์ •๋‹ต ์ฝ”๋“œ

import sys


N = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
dp = [1] * N
for i in range(N):
    for j in range(i):
        if arr[j] < arr[i]:
            dp[i] = max(dp[i], dp[j] + 1)
# print(dp)
print(max(dp))

 

 ๋ฌธ์ œ ์กฐ๊ฑด(N<=1000) ์ƒ ์ด์ค‘for ๋ฌธ์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ฒ ๋‹ค๊ณ ๋Š” ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์ ‘๊ทผ๋ฒ•์„ ๋– ์˜ฌ๋ฆฌ๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์˜€๋‹ค.

๋‘ ๊ฐœ์˜ ์ธ๋ฑ์Šค(i, j) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, arr[j] ๊ฐ€ arr[i] ๋ณด๋‹ค ์•ž์— ์œ„์น˜(j < i)ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋‹ต์€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด ์ด๋ฏ€๋กœ, ํŠน์ • ์ธ๋ฑ์Šค์—์„œ ์–ผ๋งŒํผ์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š”์ง€ ๋ณ„๋„์˜ ๋ฐฐ์—ด์— ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 ์ด ๋ณ„๋„์˜ ๋ฐฐ์—ด์€ ๊ธธ์ด๊ฐ€ N ์ธ dp ๋ผ๊ณ  ์ •ํ–ˆ๊ณ , ์ดˆ๊ธฐ ์›์†Œ๋Š” ๋ชจ๋‘ 1๋กœ ๊ฐ–๋Š”๋‹ค. ์ž์‹ ๋ณด๋‹ค ํฐ ์›์†Œ๊ฐ€ ์—†๋‹ค ํ•˜๋”๋ผ๋„, ์ž๊ธฐ ์ž์‹ ์€ ์ฒซ๋ฒˆ์งธ ์ˆœ์„œ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›์†Œ์˜ ๊ฐ’์€ ๋ชจ๋‘ 1๋กœ ์ดˆ๊ธฐํ™” ํ–ˆ๋‹ค.

 

๋‘ ์ธ๋ฑ์Šค๋ฅผ for ๋ฌธ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ์ „ํ›„์˜ ์›์†Œ๋ผ๋ฆฌ ๋Œ€์†Œ ๋น„๊ต๋ฅผ ํ•œ๋‹ค.

ํ›„์ž์˜ ์›์†Œ๊ฐ€ ๋” ํฌ๋‹ค๋ฉด, ํ›„์ž์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๋Š” dp ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š”๋ฐ, ์ „์ž์˜ dp ๊ฐ’ ๋ณด๋‹ค 1์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ max() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ dp[i] ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๋‹ค๋ฅธ ์ •๋‹ต ์ฝ”๋“œ (์†๋„ ๋น ๋ฆ„)

def sol(N, seq):
    result = [seq[0]]
    index = 0
    for i in range(1, N):
        if result[index] > seq[i]:
            result.append(seq[i])
            index += 1
        else:
            for j in range(index + 1):
                if result[j] <= seq[i]:
                    result[j] = seq[i]
                    break
    index += 1
    return index


if __name__ == "__main__":
    N = int(input())
    seq = list(map(int, input().split()))
    print(sol(N, seq))

 

 

 

 

'๐Ÿ”ฑ Algorithm > DP' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฐฑ์ค€ 11055 ํŒŒ์ด์ฌ  (0) 2022.01.23
๋ฐฑ์ค€ 1912 ํŒŒ์ด์ฌ  (0) 2022.01.20
๋ฐฑ์ค€ 12852 ํŒŒ์ด์ฌ  (1) 2022.01.12
๋ฐฑ์ค€ 2293 ํŒŒ์ด์ฌ  (0) 2022.01.09
๋ฐฑ์ค€ 1699 ํŒŒ์ด์ฌ  (0) 2022.01.07