• LeetCode 1223. Dice Roll Simulation


    原题链接在这里:https://leetcode.com/problems/dice-roll-simulation/

    题目:

    A die simulator generates a random number from 1 to 6 for each roll. You introduced a constraint to the generator such that it cannot roll the number i more than rollMax[i] (1-indexed) consecutive times. 

    Given an array of integers rollMax and an integer n, return the number of distinct sequences that can be obtained with exact n rolls.

    Two sequences are considered different if at least one element differs from each other. Since the answer may be too large, return it modulo 10^9 + 7.

    Example 1:

    Input: n = 2, rollMax = [1,1,2,2,2,3]
    Output: 34
    Explanation: There will be 2 rolls of die, if there are no constraints on the die, there are 6 * 6 = 36 possible combinations. In this case, looking at rollMax array, the numbers 1 and 2 appear at most once consecutively, therefore sequences (1,1) and (2,2) cannot occur, so the final answer is 36-2 = 34.
    

    Example 2:

    Input: n = 2, rollMax = [1,1,1,1,1,1]
    Output: 30
    

    Example 3:

    Input: n = 3, rollMax = [1,1,1,2,2,3]
    Output: 181 

    Constraints:

    • 1 <= n <= 5000
    • rollMax.length == 6
    • 1 <= rollMax[i] <= 15

    题解:

    Let dp[i][j][k] denotes number of distinct sequences up to i dice, ending with number j with k repeating j at the end.

    For previous p, if j != p, then dp[i][j][1] = sum(dp[i - 1][p][k]), sum of previous ending with p, with k repeating p at the end.

    Else if j == p, we need to make sure k + 1 <= rollMax[j], dp[i][j][k + 1] = dp[i - 1][j][k]. otherwise it would be 0. 

    Time Complexity: O(n*m*m*rMax). m = 6. rMax = max(rollMax[i]).

    Space: O(n*m*rMax).

    AC Java:

     1 class Solution {
     2     public int dieSimulator(int n, int[] rollMax) {
     3         int mod = 1000000007;
     4         int rMax = 15;
     5         
     6         int [][][] dp = new int[n + 1][6][rMax + 1];
     7         for(int i = 0; i < 6; i++){
     8             dp[1][i][1] = 1;
     9         }
    10         
    11         for(int i = 2; i <= n; i++){
    12             for(int j = 0; j < 6; j++){
    13                 for(int p = 0; p < 6; p++){
    14                     for(int k = 1; k <= rMax; k++){
    15                         if(j != p){
    16                             dp[i][j][1] = (dp[i][j][1] + dp[i - 1][p][k]) % mod;
    17                         }else if(k < rollMax[j]){ // same number, make sure k + 1 <= rollMax[j]
    18                             dp[i][j][k + 1] = dp[i - 1][j][k];
    19                         }
    20                     }
    21                 }
    22             }
    23         }
    24         
    25         int res = 0;
    26         for(int j = 0; j < 6; j++){
    27             for(int k = 1; k <= rMax; k++){
    28                 res = (res + dp[n][j][k]) % mod;
    29             }
    30         }
    31         
    32         return res;
    33     }
    34 }
  • 相关阅读:
    tmux 简明操作指南
    几种查看linux版本信息的方法
    安装Ruby&Rails遇到的问题
    安装DevKit
    gcc 编译选项
    EF数据操作详解
    值类型和引用类型的区别
    Class<T> where T:new() 含义
    50道高级sql练习题;大大提高自己的sql能力(附具体的sql)
    Entity framework 意外删除了表,如何在不影响其它表的情况下恢复回来
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/12325988.html
Copyright © 2020-2023  润新知