|
| 1 | +/* Top Down Method |
| 2 | +-----------------------------------*/ |
1 | 3 | class Solution {
|
2 |
| - |
3 |
| - int mod = 1000000007; |
| 4 | + int MOD = (int)1e9 + 7; |
| 5 | + Map<String, Integer> memo; |
4 | 6 |
|
5 | 7 | public int numRollsToTarget(int n, int k, int target) {
|
6 |
| - if (target > n * k || target < n) return 0; |
7 |
| - if (n == 1) return target < n ? 0 : 1; |
8 |
| - int[][] dp = new int[n + 1][target + 1]; |
9 |
| - return helper(n, k, target, dp); |
| 8 | + memo = new HashMap<>(); |
| 9 | + return count(n, k, target); |
| 10 | + } |
| 11 | + |
| 12 | + private int count(int n, int k, int target){ |
| 13 | + String currState = n + "," + target; |
| 14 | + if(n == 0) |
| 15 | + return (target == 0)? 1: 0; |
| 16 | + if(memo.containsKey(currState)) |
| 17 | + return memo.get(currState); |
| 18 | + |
| 19 | + int res = 0; |
| 20 | + for(int val = 1; val < k + 1; val++) |
| 21 | + res = (res + count(n - 1, k, target - val)) % MOD; |
| 22 | + memo.put(currState, res); |
| 23 | + return res; |
10 | 24 | }
|
| 25 | +} |
| 26 | + |
| 27 | +/* Bottom Up Method |
| 28 | +-----------------------------------------*/ |
| 29 | +class Solution { |
| 30 | + public int numRollsToTarget(int n, int k, int target) { |
| 31 | + int[] dp = new int[target + 1]; |
| 32 | + dp[0] = 1; |
| 33 | + int MOD = (int) 1e9 + 7; |
| 34 | + |
| 35 | + for(int dice = 0; dice < n; dice++){ |
| 36 | + int[] next_dp = new int[target + 1]; |
11 | 37 |
|
12 |
| - public int helper(int n, int k, int target, int[][] dp) { |
13 |
| - if (target > n * k || target < n) return 0; |
14 |
| - if (target == 0 && n == 0) return 1; |
15 |
| - if (dp[n][target] != 0) return dp[n][target]; |
16 |
| - int sum = 0; |
17 |
| - for (int i = 1; i <= k; i++) { |
18 |
| - sum = (sum + helper(n - 1, k, target - i, dp)) % mod; |
| 38 | + for(int val = 1; val < k + 1; val++){ |
| 39 | + for(int total = val; total < target + 1; total++){ |
| 40 | + next_dp[total] = (next_dp[total] + dp[total - val]) % MOD; |
| 41 | + } |
| 42 | + } |
| 43 | + dp = next_dp; |
19 | 44 | }
|
20 |
| - return dp[n][target] = sum; |
| 45 | + return dp[target]; |
21 | 46 | }
|
22 | 47 | }
|
0 commit comments