SRM401 Div2 500

問題

FerrersDiagramという、n=a1+a2+...+akとなるリストa1,a2,...,akでa1>a2>...>akとなるものを考える。さらにFIELD diagramというものを、nボックスが
□□...□□ ←fieldOrder個
□□...□
...
□□

と並んでいて、k行目の個数がak < fieldOrder-kであるようなFerrersDiagramとする。
整数fieldOrderが与えられるので、可能なFIELD diagramsの総数を返す。

考え方

dp.
2次元配列を用意して,問題(Example)の図のようにFerrersDiagramのマスで赤くなる個数を考えるdpを作る.
下から計算していって,その地点が何回赤くなるかを計算できる.

dp[][] = 0;
dp[fO-1][0] = 1;
for(int i=fO-2; i>=0; i--){
  for(int j=fO-i-1; j>=0; j--){
    dp[i][j] = dp[i][j+1] + (dp[i+1][0]-dp[i+1][j+1]+1);
  }
}

最終的にdp[0][0]が答えになる.

反省

実際に図を書いてみる.
前に計算した部分がそのまま使えそうならばその値でdpを立ててみる.