您的位置:首页 > 合婚

在线骰子工具(在线骰子)

在线骰子工具(在线骰子)

每日一题03:骰子模拟器

问题描述

有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。

不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号)。

现在,给你一个整数数组 rollMax 和一个整数 n,请你来计算掷 n 次骰子可得到的不同点数序列的数量。

假如两个序列中至少存在一个元素不同,就认为这两个序列是不同的。由于答案可能很大,所以请返回 模 10^9 + 7 之后的结果

示例 1:

输入:n = 2, rollMax = [1,1,2,2,2,3]输出:34解释:我们掷 2 次骰子,如果没有约束的话,共有 6 * 6 = 36 种可能的组合。但是根据 rollMax 数组,数字 1 和 2 最多连续出现一次,所以不会出现序列 (1,1) 和 (2,2)。因此,最终答案是 36-2 = 34。

示例 2:

输入:n = 2, rollMax = [1,1,1,1,1,1]输出:30

示例 3:

输入:n = 3, rollMax = [1,1,1,2,2,3]输出:181

提示:

1 <= n <= 5000rollMax.length == 61 <= rollMax[i] <= 15解题思路:

假设我们第一次丢骰子,然后丢出来了一个 11,那么我们继续丢,会发生两种情况:

丢出来的还是 11

丢出来的不是 11

如果丢出来的还是 11,那么 11 就连续出现 22 次了,我们仍然继续丢; 否则 11 就只连续出现了一次。这样,如果一直出现1,我们就一直丢下去,那么最后会有下列情况:

11 连续出现 11 次

11 连续出现 22 次

...

11 连续出现 rollMax[1] 次

如果我们用 (i,j)(i,j) 来表示我们已经丢了i次骰子,且最后的数字为j的情况总数的话,那么我们就知道 (1,1),(2,1)。。。(rollMax[1],1)(1,1),(2,1)。。。(rollMax[1],1) 的情况总数都是1。

同样,我们第一次丢出来的可能不是 11,可能是某个数 xx,那么类似的(1,x),(2,x)。。。(rollMax[1],x)(1,x),(2,x)。。。(rollMax[1],x) 的情况总数也是1。这就是初始状态了。

那么如果我们已经有 (i,j)(i,j) 的情况总数了,我们同样可以以他作为起点,比如我们又连续丢了 55 个 11,那么 (i+5,1)(i+5,1) 的情况总数需要加上 (i ,j)(i,j) 的情况总数。也就是:

dp[i,j] => dp[i+k,x] | x ∈ [1..6], k ∈ [1..rollMax[x]]

dp[i,j]=>dp[i+k,x]∣x∈[1..6],k∈[1..rollMax[x]]

代码分享

public int dieSimulator(int n, int[] rollMax) { int result = 0; double Mod = Math.pow(10, 9)+7; //动态规划d[i][j][k] sum(d[i][j] int sz = 6;//筛子数值包含1-6 int cf = 15;//每个最大重复次数不超过15次 // long[][][] data = new long[n][6][15]; //第一次掷筛子,所有位置都应该是1 for(int i=0;i<n;i++){ for(int j=0;j<sz;j++ ){ //可能掷出的筛子数字 if(i == 0){ data[i][j][0] = 1; continue; } for(int k=1;k<rollMax[j];k++){ data[i][j][k] = data[i-1][j][k-1]; } int a = 0; //前一个筛子 for(int m=0;m<sz;m++){ if(m == j){ continue; }else{ for(int p=0;p<cf;p++){ a += data[i-1][m][p]; a %= Mod; } } } data[i][j][0] = a; } } for(int i=0;i<sz;i++){ for(int j=0;j<cf;j++){ result += data[n-1][i][j]; result %= Mod; } } return result; }

每天进步1%,坚持学习。只要你一刻不停,坚持下去,你将难以想象自己能取得多么伟大的成就。欢迎和椰子一起交流,克服懒惰。

7个压箱底的在线工具网站,每一个都是免费好用,满足各种需求

今天给大家分享7个压箱底的在线工具网站,每一个都是免费好用,满足你的各种需求。

01.在线工具

https://tool.lu/

这是一个在线工具箱,包含文本类、图像类、视频类、开发类、运维类、设计类、学术类、查询类和其它类工具共80多个小工具,其中还有像是颜色转换、放假计算器这些有趣的功能,让人充满惊喜。

02.bgm生成器

https://generative.fm/

这个网站收集了很多自动生成的音乐,都特别好听,无人岛 雨天、梦...随机点击一个就能开始播放。如果你按了暂停,再次播放的音乐又不一样了,各种风格的BGM随机播放。

03.在线PS

/d/file/gt/2023-12/h1e0c402zlw