ここでのオリジナルタイトルリンク:https://leetcode.com/problems/number-of-dice-rolls-with-target-sum/
トピック:
あなたは持っている d
サイコロを、各ダイはしている f
面が、番号 1, 2, ..., f
。
(のうちの可能な方法の数を返し fd
合計方法)モジュロ 10^9 + 7
番号対等アップ顔の合計ので、サイコロを転がしします target
。
例1:
入力:D = 1、F = 6、ターゲット= 3 出力:1 説明: あなたは6面を有する1個のダイスを投げます。3の合計を取得する唯一の方法があります。
例2:
入力:D = 2、F = 6、ターゲット= 7 出力:6 説明: あなたは2個のダイス、6面を有するそれぞれを投げます。:7の合計を取得するための6つの方法があり + 6 1、+ 5 2、+ 3,4 + 3 4、+ 2 5、6 + 1。
例3:
入力:D = 2、F = 5、ターゲット= 10 出力:1つの 説明: あなたは2個のダイス、5つの顔とそれぞれを投げます。5 + 5:10の合計を取得する唯一の方法があります。
例4:
入力:D = 1、F = 2、ターゲット= 3 出力:0 説明: あなたは2面を有する1個のダイスを投げます。3の合計を取得する方法はありません。
例5:
入力:D = 30、F = 30、ターゲット= 500 出力:222616187 説明: 答えは剰余^ 9 10 + 7を返さなければなりません。
制約:
1 <= d, f <= 30
1 <= target <= 1000
ソリューション:
[k]は、ターゲットkを作るための方法を示してDPましょう。
各ダイスのために、[1、F]内の値jが存在し得ます。DP [K - j]が新しい値にaccumlatedされます。
DPのすべての元の値を必要とする新しい値は、ので、ここで我々は一時を必要としています。
時間計算:O(D * F *対象)。
スペース:O(ターゲット)。
ACのJava:
1 クラスソリューション{ 2 公共 INT numRollsToTarget(int型 D、INT F、int型のターゲット){ 3 int型 MOD =十億七。 4 INT [] DP = 新しい INT [ターゲット+ 1 ]。 5 DP [0] = 1 ; 6 7 用(INT iは= 0; I <Dは、I ++ ){ 8 INT [] TEMP = 新しい INT [ターゲット+ 1 ]。 9 用(INT J <= F; J = 1 J ++){ 10 のために(INT K <=ターゲット; K = J K ++ ){ 11 温度[K] =(温度[K] + DP [K - J])%のMOD。 12 } 13 } 14 15 DP = TEMP。 16 } 17 18 戻りDP [ターゲット]。 19 } 20 }
同様のコインの変更2。