インタビュー通りで以下の問題を解いてみました。スコアカードを数える(30点)
トーナメントでは、N 人のプレイヤーが 1 度だけ対戦します。各ゲームは、いずれかのプレイヤーが勝利します。関係はありません。トーナメント終了時に各プレイヤーのスコアを含むスコアカードを渡しました。プレーヤーのスコアは、プレーヤーがトーナメントで勝ったゲームの合計数です。ただし、一部のプレーヤーのスコアはスコアカードから消去されている可能性があります。入力スコアカードと一致するスコアカードはいくつありますか?
入力: 最初の行にはケース数 T が含まれます。T ケースが続きます。各ケースには、最初の行に数値 N が含まれ、2 行目に N の数値が続きます。i 番目の数字は、i 番目のプレーヤーのスコアである s_i を示します。i 番目のプレーヤーのスコアが消去されている場合は、-1 で表されます。
出力: 各ケースの答えを含む T 行を出力します。各結果をモジュロ 1000000007 で出力します。
Constraints:
1 <= T <= 20
1 <= N <= 40
-1 <= s_i < N
Sample Input:
5
3
-1 -1 2
3
-1 -1 -1
4
0 1 2 3
2
1 1
4
-1 -1 -1 2
Sample Output:
2
7
1
0
12
説明: 最初のケースでは、0、1、2 または 1、0、2 の 2 つのスコアカードが可能です。2 番目のケースでは、有効なスコアカードは 1,1,1、0,1,2、0,2,1、1,0,2、1,2,0、2,0,1、2,1,0 です。 . 3 番目のケースでは、有効なスコアカードは {0,1,2,3} のみです。4 番目のケースでは、有効なスコアカードがありません。両方のプレイヤーのスコアが 1 になることはありません。
私はジェネリック関数のアプローチを考え出そうとしましたが、動的プログラミングを使用してこの問題を突き止めようとしています。この問題の再帰関係をどのように考えることができますか?.