ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

AOJ 2965 - F グリッドの番号

問題
提出コード

解法

小さい順に数字を当てはめていくとき、上段の右端に配置するか、下段の右端に配置するかの二択になることを利用します。
dp[i][j][s] = i番目までの数字を入れ終えて、上段に配置した個数がj個かつ、直近k手の上下の配置情報がsのときの配置の通り数
とします。
配るDPを考えると、
dp[i][j][s]を配る箇所は、i+1を上段の左からj+1番目に配置した場合と、下段のi-j + 1番目に配置した場合の2か所です。
それぞれのパターンについて、配置したときに矛盾がないかを確認し、問題が無ければ値を配れば良いです。
矛盾がないかを確認するには、sをもとに状態を復元します。
上段に配置する場合は、上段のj番目の数をチェックしてi+1との差がk以下か、
下段に配置する場合は、上段のi-j+1番目の数と下段のi-j番目の数をチェックして、i+1との差がk以下かチェックすればよいです。