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

コメントを残す

メールアドレスが公開されることはありません。