leetcode 1223サイコロシミュレーション

トピック:

シミュレータは各時間を投げ、サイコロは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を返します。
    }
}。

 

おすすめ

転載: www.cnblogs.com/ljy08163268/p/11685688.html