第4回 ドワンゴからの挑戦状 予選-C:Kill/Death(500)

問題

https://beta.atcoder.jp/contests/dwacon2018-prelims/tasks/dwacon2018_prelims_c

制約

  •  1 \le N, M \le
  •  0 \leq killA_i, killB_i
  •  killA_1 + killA_2 + ... + killA_N \leq 1,000
  •  killB_1 + killB_2 + ... + killB_N \leq 1,000

考え方

killA の要素数 N \sum killB_i = sb を割り当てていくことになるが、killA の値が同じ場合は、Death 数が昇順になるようにいけない条件が面倒である。

なお分割数は既知とし、数 ij つに分割する分割数を f(j, i) と表すことにする。

killA の値が同じものをグループとしてまとめて考えていくことにし、それぞれのグループの要素の数を group_i とする。このときのグループ数を n とする。また、前から g 番目のグループまでで総和 sum を分割する場合の数を dp[g][sum] と表すことにする。

このとき、次のグループ数に対して数 i を割り当てる場合の数は分割数で求めることできるので以下のようにDP遷移を考えることができる。

dp[g+1][sum+i] = dp[g][sum] * f(group_g, i)

Submission #3650213 - 第4回 ドワンゴからの挑戦状 予選

ポイント

  • 分割数
  • DP

類題