๋ฌธ์
https://www.acmicpc.net/problem/13302
13302๋ฒ: ๋ฆฌ์กฐํธ
์์์ด๋ ์ฌ๋ฆ๋ฐฉํ์ ๋ง์ดํ์ฌ ๋ง์ ๋์ด ์์ค์ด ์๋ KOI ๋ฆฌ์กฐํธ์ ๋๋ฌ๊ฐ๋ ค๊ณ ํ๋ค. ๋ฆฌ์กฐํธ์ ํ๋ฃจ ์ด์ฉ๊ถ์ ๊ฐ๊ฒฉ์ ๋ง์์ด๋ค. ํ์ง๋ง ๋ฆฌ์กฐํธ์ ๊ท๋ชจ๋ ์์์ ์ด์ํ์ฌ ๋ชจ๋ ์์ค์ ์ถฉ๋ถํ
www.acmicpc.net
๋ฌธ์ ํ์ด
1์ผ๊ถ, 3์ผ๊ถ, 5์ผ๊ถ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ์ฟ ํฐ์ ์ฌ์ฉํด์ ๋ฆฌ์กฐํธ ์ด์ฉ์ ์ํ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ dp ๋ฌธ์ ์ด๋ค.
bottom-up ๋ฐฉ์์ผ๋ก ๊ฐ๊ฐ ๋ ์ ๋ํด dp ๊ฐ์ ๊ฐฑ์ ํด์ฃผ์๋ค.
dp[day][coupon]์ผ๋ก 2์ฐจ์ dp ๋ฐฐ์ด์ ์ ์ธํด์ ์ด์ฉ๊ถ์ ๋ฐ๋ผ ์ฟ ํฐ ๊ฐ๋ ๊ฐฑ์ ํด์ฃผ์๋ค.
1์ผ๊ถ ๊ตฌ๋งค | dp[i+1][j]=min(result+10000 , dp[i+1][j]) |
3์ผ๊ถ ๊ตฌ๋งค | dp[i+k][j+1]=min(result+25000 , dp[i+k][j+1]) ##k=1,2,3 |
5์ผ๊ถ ๊ตฌ๋งค | dp[i+k][j+2]=min(result + 37000 , dp[i+k][j+2]) ##k=1,2,3,4,5 |
์ฟ ํฐ 3์ฅ ์ด์ | dp[i+1][j-3]=min(result,dp[i+1][j-3]) |
๋ฆฌ์กฐํธ ๋ฐฉ๋ฌธ X | dp[i+1][j]=min(result,dp[i+1][j]) |
์ฝ๋
import sys
input=sys.stdin.readline
n,m=map(int,input().split()) #n<=100
no=list(map(int,input().split()))
inf=sys.maxsize
dp=[[inf]*106 for _ in range(106)]
dp[0][0]=0
for i in range(n+1):
for j in range(40): ##์ต๋ ์ฟ ํฐ ๋ฐํ ๊ฐฏ์ ==40๊ฐ
if dp[i][j]==inf:
continue
result=dp[i][j]
if i+1 in no:
dp[i+1][j]=min(result,dp[i+1][j])
if j>=3:
dp[i+1][j-3]=min(result,dp[i+1][j-3])
#1์ผ๊ถ
dp[i+1][j]=min(dp[i+1][j],result+10000)
#3์ผ๊ถ
for k in range(1,4):
dp[i+k][j+1]=min(dp[i+k][j+1],result+25000)
#5์ผ๊ถ
k=0
for k in range(1,6):
dp[i+k][j+2]=min(dp[i+k][j+2],result+37000)
print(min(dp[n]))
์ด๋ ค์ ๋ ์
์ฒซ๋ ์ 3์ผ๊ถ์ ๊ตฌ์ ํ๋ฉด ๋์งธ ๋ ์๋ 25000์ ์ง๋ถ๊ณผ ์ฟ ํฐ 1์ฅ ๋ณด์ ๋ ์ ์ฉ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋งค์ผ๋งค์ผ ๊ฐ์ ๊ฐฑ์ ํด ์ฃผ์ด์ผ ํ๋ค.
์ฒ์์ 3์ผ๊ถ, 5์ผ๊ถ์ ๊ตฌ๋งคํ ๋ [i+3] ์ผ๊ณผ [i+5] ์ผ๋ง ๊ณ์ฐํ๋ฉด ๋๋ค๊ณ ์๊ฐํด์ ํ๋ ธ์๋ค
'๐ป ์๊ณ ๋ฆฌ์ฆ > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/๋ฐฑ์ค] 1074 Z - ํ์ด์ฌ (0) | 2021.09.17 |
---|---|
[BOJ/๋ฐฑ์ค] 14891 ํฑ๋๋ฐํด - ํ์ด์ฌ (0) | 2021.09.15 |
[BOJ/๋ฐฑ์ค] 20923 ์ซ์ ํ ๋ฆฌ๊ฐ๋ฆฌ ๊ฒ์ - ํ์ด์ฌ (0) | 2021.08.24 |
[BOJ/๋ฐฑ์ค] 17396 ๋ฐฑ๋์ด - ํ์ด์ฌ (0) | 2021.08.23 |
[BOJ/๋ฐฑ์ค] 11582๋ฒ ํ์ด์ฌ - ์นํจ TOP N (0) | 2021.07.25 |