2008年 日本情報オリンピック春合宿OJ nile - Nile.Com【Python】
問題はこちら。
いかにもdpだけど持ち方に工夫がいる。
dp[i][d][n] = d日目に店舗nからi日以上連続で購入し、d日目にi日連続購入割引を適用したときの最小費用 --- ①
とするとうまくいく。なにやら複雑だが
dp[i][d][n] = d日目に店舗nからi日以上連続で購入したときの最小費用
とすると遷移がややこしくなってしまうので①のように持つ。
古い問題はメモリ制約が厳しいので節約のためにdを落とす。
import sys
readline = sys.stdin.readline
def main():
INF = float('inf')
N, D = map(int, readline().split())
dp = [[INF]*N for _ in range(3)]
for d in range(D):
cost = list(map(int, readline().split()))
if d == 0:
min_cost = 0
else:
min_cost = min(min(dp[0]), min(dp[1]), min(dp[2]))
for n in range(N):
dp[0][n], dp[1][n], dp[2][n] = \
min_cost + cost[n], \
dp[0][n] + cost[n]*9 // 10, min(dp[1][n], \
dp[2][n]) + cost[n]*7 // 10
ans = min(min(dp[0]), min(dp[1]), min(dp[2]))
print(ans)
if __name__ == "__main__":
main()
この記事が気に入ったらサポートをしてみませんか?