f(N,M,K)f(N,M,K)を求める値とします。

  • 右に移動するとNNマス確定するのでf(N,M1,KN)f(N,M-1,K-N)
  • 上に移動すると確定マスはないのでf(N1,M,K)f(N-1,M,K)

これを元にDPを行えばよいです。

f(N,M,K)=f(N,M1,KN)+f(N,M1,KN)f(N,M,K)=f(N,M-1,K-N)+f(N,M-1,K-N)


余談(本題)

この問題の答えは「KKNN個以下の『MM以下の非負整数』に分割する方法の数」と一致します。ヤング図形みたいな感じで考えたら分かると思います。

実はこの問題、DPだとO(NMK)O(NMK)かかりますが、形式的冪級数を用いるとO(KlogK)O(K\log{K})で解くことができます。すごいですね。

O(KlogK)O(K\log{K})アルゴリズムを置いておきたかったという理由だけでこの問題作りました。

ちなみに、問題から分かることですが、

  • KNMKK\leftarrow NM-K
  • Nmin(N,K)N\leftarrow \min(N,K)
  • Mmin(M,K)M\leftarrow \min(M,K)
  • swap(N,M)swap(N,M)

とかの操作をしても答えは変わりません。