[BOJ][๐ก5][๋ฐฑ์ค#10710] ์คํฌ๋ก๋
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๊ณผ๊ฑฐ ์นด์ํ์คํ์๋ย โ์คํฌ๋ก๋โ๋ผ๋ ๊ต์ญ๋ก๊ฐ ์์๋ค. ์คํฌ๋ก๋๋ 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]์ ์ ์ฅ๋ ๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ