この記事で使うアルゴリズム
動的計画法
はじめに
カテゴリー競プロ初中級者100問では、Qiita
にて@e869120
さんがレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】としてまとめられている100問をPython
で解いています。
全問題の一覧はこちらです
問題
https://atcoder.jp/contests/joi2011yo/tasks/joi2011yo_d
この問題は動的計画法を用いて解くことができます。
方針
左からn
個の数字を使ってm
を実現できる組み合わせの数をdp[n][m]
として計算していきます。
コード
A[0]
を取り出している意図ですが、これはA[0]=0
の場合に対処するためです。この操作をせずにdp[0][0]=1
としてしまうと、最初のn=0
のループの後に、dp[1][0]=2
となってしまいます。(一つ目の数字であるにも関わらず、同じ場所dp[0][0]
を参照して二度もらってしまう。)
あるいは、DP
の更新部分で条件式を
1 | if m+A[n] >= 0: |
1 | if n>0 and m+A[n] >= 0: |
のように書き換えても良いでしょう。
1 | N = int(input()) |
記事情報
- 投稿日:2020年6月8日
- 最終更新日:2020年6月8日