AtCoder Beginner Contest 153 E – Creasted Ibis vs Monster をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 153 E – Creasted Ibis vs Monster

同じ要素を複数回使うことができるタイプのDPの基礎的な問題。すんなり解けるようになっておきたい。

# AtCoder Beginner Contest 153 E - Creasted Ibis vs Monster
# https://atcoder.jp/contests/abc153/tasks/abc153_e
# tag: DP 基礎問題

# 一つの要素を好きな回数使用することができる場合の、
# 典型かつ基礎的な DP を使用する問題。
# ここでは、配列を使いまわしながら解いていっている。

# ちなみに、Python だと TLE になってしまうので
# Pypy で提出するようにしよう。

# 配るDP
def main():
H, N = map(int, input().split())
magics = [list(map(int, input().split())) for _ in range(N)]

# dpt[d]: = 合計使用魔力
# d = モンスターに与えたダメージ量
dpt = [10**9] * (H+1)
dpt[0] = 0
for dmg, mp in magics:
for d in range(H):
dmg_nxt = min(H, d + dmg)
mp_nxt = dpt[d] + mp
if dpt[dmg_nxt] > mp_nxt:
dpt[dmg_nxt] = mp_nxt

print(dpt[-1])

main()

# もらうDP
def main2():
H, N = map(int, input().split())
magics = [list(map(int, input().split())) for _ in range(N)]

# dpt[d]: = 合計使用魔力
# d = モンスターに与えたダメージ量
dpt = [10**9] * (H+1)
dpt[0] = 0
for dmg, mp in magics:
for d in range(1, H+1):
prev_dmg = max(0, d - dmg)
prev_mp = dpt[prev_dmg]

if dpt[d] > prev_mp + mp:
dpt[d] = prev_mp + mp

print(dpt[-1])

# main2()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です