トピック:
シミュレータは各時間を投げ、サイコロは1と6の間の乱数を生成有します。
しかし、我々はそれを使用することで制限を持っている、それはサイコロを転がしための時間を作ることです、連続スローデジタル i
数を超えることはできません rollMax[i]
(i
番号は1から始まります)。
さて、あなたの整数の配列与える rollMax
と整数を n
、あなたは計算に投げる n
倍異なる点サイコロ利用可能な配列の数を。
一つの要素中に存在する場合、少なくとも二つの異なる配列、二つの配列が異なると考えられます。答えは大きいかもしれないので、そう返してくださいモードを 10^9 + 7
結果した後。
アイデア:
動的プログラミングは、DP [n]は[I]提供されるn個の長さを表し、最後の番号の末尾は、Iの組合せの数です。
DP [N] [i]を全て等しいとnの最初の長さ(2 N-N-1、 ...、N-rollmax [I]) ビットがポートフォリオと私はありません。
コード:
const int型MOD = 1E9 + 7。
クラスソリューション{
パブリック:
INT DP [5010] [10]。
INT dieSimulator(整数nは、ベクトル<整数>&rollMax){
{(; iが<= N I ++は、I = 1 INT)のため
のために(INT J = 1; J <= 6; J ++){
(INT P = 1 ; p <=分(I、rollMax [J-1]); P ++){
IF(P == I){DP [I] [J] =(DP [I] [J] +1)%MOD。引き続き;}
ため(INT q = 1であり、q <= 6; Q ++){
(qは== j)が続く場合、
DP [I] [J] =(DP [I] [J] + DP [IP] [Q])%MOD。
}
}
}
}
int型ANS = 0。
以下のために(; iは6 = <; I = 1 int型私は++)ANS =(ANS + DP [n]は[I])%MOD。
ANSを返します。
}
}。