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()
関連