[BOJ][๐ŸŸก5][๋ฐฑ์ค€#10710] ์‹คํฌ๋กœ๋“œ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #10710


๋ฌธ์ œ

๊ณผ๊ฑฐ ์นด์žํ์Šคํƒ„์—๋Š”ย โ€์‹คํฌ๋กœ๋“œโ€๋ผ๋Š” ๊ต์—ญ๋กœ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์‹คํฌ๋กœ๋“œ๋Š” N + 1 ๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๊ณ , ์„œ์ชฝ๋ถ€ํ„ฐ ๋„์‹œ 0, ๋„์‹œ 1, โ€ฆ, ๋„์‹œ N์ด๋‹ค.ย ๋„์‹œ i - 1๊ณผ ๋„์‹œ iย (1 โ‰ฆ i โ‰ฆ N) ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋Š” Di์ด๋‹ค. ๋ฌด์—ญ์ƒ์ธย JOI ๊ตฐ์€ ๋„์‹œ 0์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋„์‹œ๋ฅผ ์ฐจ๋ก€๋กœ ๊ฒฝ์œ ํ•˜์—ฌ ๋„์‹œ N๊นŒ์ง€ ์‹คํฌ๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋„์‹œ 0์—์„œ ๋„์‹œ N๊นŒ์ง€ M ์ด๋‚ด์— ์ด๋™ํ•ด์•ผํ•œ๋‹ค. JOI ๊ตฐ์€ ๊ฐ๊ฐ์˜ ๋‚ ์—ย ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ค‘ย ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•œ๋‹ค.

์ด๋™ : ํ˜„์žฌ์˜ ๋„์‹œ์—์„œ ๋™์ชฝ์˜ ๋„์‹œ๋กœ 1 ์ผ ๊ฑธ์ณ ์ด๋™ํ•œ๋‹ค. ํ˜„์žฌ ๋„์‹œ i - 1 (1 โ‰ฆ i โ‰ฆ N)์— ์žˆ๋‹ค๋ฉด, ๋„์‹œ i๋กœ ์ด๋™ํ•œ๋‹ค. ๋Œ€๊ธฐ : ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ๋„์‹œ์—์„œ 1 ์ผ ๋Œ€๊ธฐํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜,ย ์ด๋™ย ํ•  ๋•Œ๋งˆ๋‹ค ํ”ผ๋กœ๋„๊ฐ€ ์Œ“์—ฌ ๊ฐ„๋‹ค. ์‹คํฌ๋กœ๋“œ์—์„œ๋Š”ย ๋งค์ผย ๋‚ ์”จ๋ณ€ํ™”๊ฐ€ย ๋‚˜์œ ์ •๋„์— ๋”ฐ๋ผ ์ด๋™์— ์–ด๋ ค์›€์ด ์ธก์ •๋œ๋‹ค. JOI ๊ตฐ์€ย M ์ผ ์ค‘ j ์ผ์งธ (1 โ‰ฆ j โ‰ฆ M)์˜ ๋‚ ์”จ๊ฐ€ย Cj์ž„์„ ์•Œ๊ณ ์žˆ๋‹ค. ๋„์‹œ i - 1์—์„œ ๋„์‹œ i (1 โ‰ฆ i โ‰ฆ N)์— j ์ผ์งธ (1 โ‰ฆ j โ‰ฆ M)๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ, ํ”ผ๋กœ๋„๊ฐ€ Di ร— Cj ๋งŒ ์Œ“์—ฌ ๋ฒ„๋ฆฐ๋‹ค. ์ด๋™ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‚ ์€ ํ”ผ๋กœ๋„๊ฐ€ ์Œ“์ด์ง€ ์•Š๋Š”๋‹ค. JOI ๊ตฐ์€ ๊ฐ๊ฐ์˜ ๋‚ ์— ํ–‰๋™์„ ์ž˜ ์„ ํƒํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ํ”ผ๋กœ๋„๋ฅผ ์ ๊ฒŒํ•ด์„œย ์ด๋™ํ•˜๊ณ  ์‹ถ๋‹ค. JOI ๊ตฐ์ด M ์ด๋‚ด์— ๋„์‹œ N์œผ๋กœ ์ด๋™ํ•  ๋•Œ์˜ ํ”ผ๋กœ๋„ ์ดํ•ฉ์˜ ์ตœ์†Œ๋ฅผ ๊ตฌํ•ด๋ผ.


์ž…๋ ฅ

์ž…๋ ฅ์€ 1 + N + M ํ–‰์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ N, M (1 โ‰ฆ N โ‰ฆ M โ‰ฆ 1000)๊ฐ€ ๊ณต๋ฐฑ์„ ๊ตฌ๋ถ„์œผ๋กœ ์“ฐ์—ฌ์ ธ์žˆ๋‹ค. ย ์ด๊ฒƒ์€ ์‹คํฌ๋กœ๋“œ๊ฐ€ N + 1 ๊ฐœ์˜ ๋„์‹œ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, JOI ๊ตฐ์ด ์‹คํฌ๋ฅผ ๋„์‹œ 0์—์„œ ๋„์‹œ N๊นŒ์ง€ M ์ด๋‚ด์— ์‹ค์‹œํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹ค์Œ N ๋ผ์ธ ์ค‘ i ๋ฒˆ์งธ ์ค„ (1 โ‰ฆ i โ‰ฆ N)์—๋Š” ์ •์ˆ˜ Di (1 โ‰ฆ Di โ‰ฆ 1000)๊ฐ€ ์ ํ˜€์žˆ๋‹ค. ์ด๊ฒƒ์€ ๋„์‹œ i - 1๊ณผ ๋„์‹œ i ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๊ฐ€ Di์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹ค์Œ M ๋ผ์ธ ์ค‘ j ๋ฒˆ์งธ ์ค„ (1 โ‰ฆ j โ‰ฆ M)์—๋Š” ์ •์ˆ˜ Cj (1 โ‰ฆ Cj โ‰ฆ 1000)๊ฐ€ ์ ํ˜€์žˆ๋‹ค. ์ด๊ฒƒ์€ j ์ผ์งธ ๋‚ ์”จ ๋‚˜์จ์ •๋„๊ฐ€ย Cj์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.


์ถœ๋ ฅ

JOI ๊ตฐ์ด M ์ด๋‚ด์— ๋„์‹œ N์œผ๋กœ ์ด๋™ํ•  ๋•Œ์˜ ํ”ผ๋กœ๋„ ์ดํ•ฉ์˜ ์ตœ์†Œ๋ฅผย ํ•œ ์ค„๋กœ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

3 5
10
25
15
50
30
15
40
30


์ถœ๋ ฅ

1125


์˜ˆ์ œ 2

์ž…๋ ฅ

2 6
99
20
490
612
515
131
931
1000


์ถœ๋ ฅ

31589


My Sol

import sys
input = sys.stdin.readline

N, M = map(int, input().split())
D = [0]+[int(input()) for _ in range(N)]
T = [0]+[int(input()) for _ in range(M)]
memo = [[0]*(N+1) for _ in range(M+1)]
for k in range(1, N+1):
    memo[k][k] = memo[k-1][k-1] + T[k]*D[k]

for j in range(1, N+1):
    for i in range(j+1, M+1):
        memo[i][j] = min(memo[i-1][j-1]+D[j]*T[i], memo[i-1][j])

print(memo[M][N])

์–ผ๋งˆ์ „์— ์ฒ˜์Œ ์ตํ˜”๋˜ ๋ฐฐ๋‚ญ๋ฌธ์ œ์˜ ํ™•์žฅํŒ์ด์—ˆ๋‹ค. ์–ด๋Š ๋‚ ์— ํ•œ ๋ฒˆ ๋‚˜์•„๊ฐ€๊ฒŒ ๋œ๋‹ค๋ฉด ์ด์ „ ํ”ผ๋กœ๋„ ํ•ฉ์— ํ˜„์žฌ ํ”ผ๋กœ๋„๋ฅผ ๋”ํ•œ ๊ฐ’์ด ์žˆ์„ ๊ฒƒ์ด๊ณ , ์ด๋ฏธ ์ด์ „์— ํ•œ์ฐธ ๋‹ฌ๋ ค ์˜ค๋Š˜ ๋‚˜์•„๊ฐ€์ง€ ์•Š๋”๋ผ๋„ ํ˜„์žฌ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘ ํ”ผ๋กœ๋„ ํ•ฉ์ด ๋” ์ ์€ ๊ฒฝ์šฐ๋ฅผ ํ˜„์žฌ ํ”ผ๋กœ๋„๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฒ˜์Œ์— memo ๋ฐฐ์—ด์˜ ๊ธฐ๋ณธ๊ฐ’์€ ์ฒซ๋‚ ๋ถ€ํ„ฐ ๊ณ„์† ๋‹ฌ๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ , ํ–‰์€ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‚ ๋“ค, ์—ด์€ ๋‚˜์•„๊ฐ€์•ผ ํ•  ๋‚ ๋“ค๋กœ ์ง€์ •ํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ–‰์ด ์ง„ํ–‰๋  ๋•Œ๋งˆ๋‹ค ์„ ํƒ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‚˜์•„๊ฐˆ ๊ฒƒ์ธ์ง€ ๋ง ๊ฒƒ์ธ์ง€.

๊ทธ๋ž˜์„œ ์ตœ์†Ÿ๊ฐ’๋“ค์„ ๊ฐ ์ขŒํ‘œ์— ์ €์žฅํ•˜๊ณ , memo[M][N]์— ์ €์žฅ๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ