1
1
class Solution {
2
2
public:
3
- #define inf 1000000007
4
3
int dieSimulator (int n, vector<int >& rollMax) {
5
- // int dp[rolls][no][cnt]
6
- vector<vector<vector<int >>> dp (n, vector<vector<int >>(6 , vector<int >(16 , 0 )));
7
-
8
- // dp[r = 1][n][c]
9
- for (int j = 0 ; j < 6 ; j++){
10
- dp[0 ][j][1 ] = 1 ;
4
+ return getWays (n, rollMax);
5
+ }
6
+
7
+ int getWays (int n, vector<int > maxRolls) {
8
+ // Code here
9
+ // dp[i][j] = no of seq till i throws and ending in j
10
+ const int mod = 1e9 + 7 ;
11
+ int dp[n + 1 ][8 ];
12
+
13
+ for (int i = 0 ; i < 6 ; i++) {
14
+ dp[1 ][i] = 1 ;
11
15
}
12
-
13
- for (int i = 1 ; i < n; i++){
14
- for (int j = 0 ; j < 6 ; j++){
16
+ dp[1 ][6 ] = 6 ;
17
+
18
+ for (int i = 2 ; i <= n; i++) {
19
+ int sum = dp[i - 1 ][6 ];// prev all sum
20
+ int tot = 0 ;
21
+
22
+ for (int j = 0 ; j < 6 ; j++) {
23
+ int val = 0 ;
24
+ int prev_pos_till = i - maxRolls[j] - 1 ;
15
25
16
- // case 1 : dp[r][n][1]
17
- for ( int k = 0 ; k < 6 ; k++){
18
- if (k == j) continue ;
19
- for ( int m = 1 ; m <= rollMax[k]; m++){
20
- dp[i][j][ 1 ] = (dp[i][j][ 1 ] + dp[i - 1 ][k][m]) % inf;
21
- }
26
+ if (prev_pos_till < 0 )
27
+ val = val + 0 ;
28
+ else if (prev_pos_till == 0 ) {
29
+ val = val + 1 ;
30
+ } else {
31
+ val = val + (dp[prev_pos_till][ 6 ] - dp[prev_pos_till][j]) % mod;
22
32
}
23
-
24
- // case 2: dp[r][n][>=2]
25
- for (int m = 2 ; m <= rollMax[j]; m++){
26
- dp[i][j][m] = dp[i - 1 ][j][m - 1 ];
27
- }
28
- }
29
- }
30
-
31
- int cnt = 0 ;
32
- for (int j = 0 ; j < 6 ; j++){
33
- for (int k = 1 ; k <= rollMax[j]; k++){
34
- cnt = (cnt + dp[n - 1 ][j][k]) % inf;
33
+
34
+ int v = (sum - val) % mod;
35
+ v = (v + mod) % mod;
36
+ dp[i][j] = v;
37
+ tot = (tot + v) % mod;
35
38
}
39
+
40
+ dp[i][6 ] = tot;
36
41
}
37
-
38
- return cnt;
39
- }
40
- };
41
- // general house paint, no consecutive houses same color
42
- // dp[h][c] = sum(dp[h - 1][cc]) cc != c
42
+
43
+ return dp[n][6 ];
44
+ }
45
+ };
0 commit comments