当前位置: 首页 > news >正文

桃城网站建设域名查询万网

桃城网站建设,域名查询万网,银川网站建设哪家好叫啥名字,网站管理员作用题目链接 Leetcode.1223 掷骰子模拟 Rating : 2008 题目描述 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1…

题目链接

Leetcode.1223 掷骰子模拟 Rating : 2008

题目描述

有一个骰子模拟器会每次投掷的时候生成一个 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<=50001 <= n <= 50001<=n<=5000
  • rollMax.length==6rollMax.length == 6rollMax.length==6
  • 1<=rollMax[i]<=151 <= rollMax[i] <= 151<=rollMax[i]<=15

分析:

使用 动态规划 的方式求解。

我们定义 f(i,j,times)f(i,j,times)f(i,j,times) 为投掷了 i次骰子,并且第 i个骰子的点数是 j,且这个 j的连续出现次数是 times的不同序列数量。

按照定义,最终返回的结果为 f(n,1,1)+f(n,1,2)+...f(n,1,rollMax[0])...f(n,2,1)+f(n,2,2)...+f(n,2,rollMax[1]+...f(n,6,rollMax[5])f(n,1,1) + f(n,1,2) + ...f(n,1,rollMax[0])...f(n,2,1)+f(n,2,2)...+f(n,2,rollMax[1] + ...f(n,6,rollMax[5])f(n,1,1)+f(n,1,2)+...f(n,1,rollMax[0])...f(n,2,1)+f(n,2,2)...+f(n,2,rollMax[1]+...f(n,6,rollMax[5])

∑j=16∑times=1rollMax[j−1]f(n,j,times)\sum_{j=1}^{6}\sum_{times=1}^{rollMax[j-1]}f(n,j,times)j=16times=1rollMax[j1]f(n,j,times)

状态转移:

  • 当 当前点k不等于 前一个点j时,f(i,k,1)=(f(i,k,1)+f(i−1,j,times))mod109+7f(i,k,1) = (f(i,k,1)+f(i-1,j,times)) mod 10^9+7f(i,k,1)=(f(i,k,1)+f(i1,j,times))mod109+7
  • 当 当前点k等于 前一个点j并且 times+1小于等于 rollMax[j-1]时,f(i,j,times+1)=(f(i,j,times+1)+f(i−1,j,times))mod109+7f(i,j,times+1) = (f(i,j,times+1) + f(i-1,j,times)) mod 10^9+7f(i,j,times+1)=(f(i,j,times+1)+f(i1,j,times))mod109+7

时间复杂度:O(n∗36∗15)O(n * 36 * 15)O(n3615)

C++代码:

const int MOD = 1e9+7;
using LL = long long;
class Solution {
public:int dieSimulator(int n, vector<int>& rollMax) {int f[n+1][7][16];memset(f,0,sizeof f);//初始化只投掷一次骰子的情况for(int i = 1;i <= 6;i++){f[1][i][1] = 1;}for(int i = 2;i <= n;i++){for(int j = 1;j <= 6;j++){for(int times = 1;times <= rollMax[j-1];times++){for(int k = 1;k <= 6;k++){if(j != k) f[i][k][1] = (f[i][k][1] + f[i-1][j][times])%MOD;else if(times + 1 <= rollMax[j - 1]){f[i][j][times+1] = (f[i][j][times+1] + f[i-1][j][times])%MOD;}}}}}LL ans = 0;//统计总的数量for(int j = 1;j <= 6;j++){for(int times = 1;times <= rollMax[j-1];times++) ans += f[n][j][times];}return ans % MOD;}
};

Java代码:

class Solution {private final int MOD = 1000_000_000+7;public int dieSimulator(int n, int[] rollMax) {int [][][] f = new int[n+1][7][16];for(int i = 1;i <= 6;i++){f[1][i][1] = 1;}for(int i = 2;i <= n;i++){for(int j = 1;j <= 6;j++){for(int times = 1;times <= rollMax[j-1];times++){for(int k = 1;k <= 6;k++){if(j != k) f[i][k][1] = (f[i][k][1] + f[i-1][j][times])%MOD;else if(times + 1 <= rollMax[j - 1]){f[i][j][times+1] = (f[i][j][times+1] + f[i-1][j][times])%MOD;}}}}}long ans = 0;for(int j = 1;j <= 6;j++){for(int times = 1;times <= rollMax[j-1];times++) ans += f[n][j][times];}return (int)(ans % MOD);}
}
http://www.hengruixuexiao.com/news/40649.html

相关文章:

  • 网站建设与管理李洪心西安外包公司排行
  • 低价网站建设费用多少域名关键词排名查询
  • 关于做好学院网站建设的要求推广普通话手抄报简单漂亮
  • 浙江网站建设费用网站搜索排名
  • 企业做网站的坏处福州seo优化
  • 做一个类似微博的网站需要怎麼做上海广告公司
  • 做免费的网站教程最新互联网项目平台网站
  • wordpress教程视频seo排名点击器曝光行者seo
  • 所有免费的网站有哪些互联网网站
  • 上海网站制作团队seo机构
  • 做网站需要交钱吗semester怎么读
  • wordpress 字体 图标网站seo什么意思
  • 如何做电影下载网站成都seo
  • 青园网站建设软文推广范文
  • 优秀网站设计要素网络营销具有哪些特点
  • 网站开发网站建设公司外贸怎么找客户资源
  • 哪个网站做新中式自己建网页
  • 彩票网站的建设搜索引擎营销简称
  • laravel网站怎么做项目360站长工具seo
  • 山东天齐建设集团网站百度客户电话
  • 徐州 网站建设软文媒体发稿平台
  • 网站建设营销怎么做网站内部seo优化包括
  • 专门做优选的网站广州网络推广公司排名
  • 本地环境搭建网站疫情死亡最新数据消息
  • 网站制作 常见问题百度网址安全检测
  • 做网站多少分辨率就可以百度的搜索引擎优化
  • 做商城网站要哪些流程图长春网站建设推广
  • 分栏式的网站有哪些搜索引擎推广的常见形式有
  • 上传产品网站怎么做重庆seo结算
  • 公司资质代办百度关键词优化首选667seo