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

武夷山网站建设免费的自助建站

武夷山网站建设,免费的自助建站,企业信息公共服务平台,wordpress问答悬赏功能1223. 掷骰子模拟 题目描述 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号)。 现在,…

1223. 掷骰子模拟

题目描述

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

算法一:动态规划

思路

  • 首先,创建一个二维 dp 数组;

  • dp[i][j] 表示第 i 次掷骰子时,数字 j 出现的可能的序列总数,也就是说,第 i 次掷出的数字是 j 所有可能的序列数 , 其中 1 <= i <= n , 1 <= j <= 6 。

  • 显然, dp[1][1],dp[1][2]… dp[1][6]均为 1 ,所以,最后结果有效序列总数就是 sum (dp[n][1] + dp[n][2] + … + dp[n][6]) , sum为求和函数 。

  • 那么,如何计算第i次骰子掷出时,掷出数字为j的序列总数为多少呢? 仔细思考一下dp[i][j]和什么有关?

    • 第一: dp[i][j] 和dp[i-1][j]有关,不仅如此,dp[i][j] 和 dp[i-1][1], dp[i-1][2],…dp[i-1][6]都有关;
    • 第二: 由于连续数字限制,dp[i][j]还和 dp[i-rollMax[j-1]][1],…,dp[i-rollMax[j-1]][6]均有关;
    • 所以,第i次掷出骰子的序列总数只和第i-1次掷出骰子的序列总数,以及第i-rollMax[j-1]次掷出骰子的序列总数有关。
    • 详细例子看题解。
    • 状态方程为 :
      在这里插入图片描述
  • 需要主要对大数的处理, 使用 int 型很容易越界;

  • 另外,代码中有一个特殊条件的判断,当 idx == 0 时,ans 直接减一 ;此时,第 1 次 ~ 第 i - 1次掷出的都是 k ,即出现了序列 kkk…kk ,因此不合法的情况只有一种,所以减一。

算法情况

  • 时间复杂度:O(6n),即O(n);
  • 空间复杂度:O(7(n+1)),即 O(n)。

在这里插入图片描述

代码

class Solution {
public:const int MOD = 1e9 + 7;typedef long long LL;int dieSimulator(int n, vector<int>& rollMax) {vector<vector<LL> > dp(n+1, vector<LL>(7));// 初始化for (int j = 1; j <= 6; j++) {dp[1][j] = 1;}for (int i = 2; i <= n; i++) {for (int j = 1; j <= 6; j++) {// 加入第 i-1 次得所有可能序列总数LL ans = accumulate(dp[i-1].begin(), dp[i-1].end(), 0LL);int idx = i - 1 - rollMax[j-1];if (idx >= 1) {// 减去 i - 1 - rollMax[j-1]次掷出除j外其他五个数的所有序列总数ans = accumulate(dp[idx].begin(), dp[idx].end(), ans, [&](LL init, LL e) {return init + MOD - e;});ans += dp[idx][j];}else if (idx == 0) {// 特殊情况处理ans -= 1;}dp[i][j] = ans % MOD;}}return accumulate(dp[n].begin(), dp[n].end(), 0LL) % MOD;}
};

参考资料:

  1. 超简单动态规划! 复杂度O(n)
http://www.dinnco.com/news/53324.html

相关文章:

  • 网站建设依据搜索引擎营销特点
  • 深圳租赁住房和建设局网站民宿平台搜索量上涨
  • 网站开发用框架开发的优缺点seo免费教程
  • 淘宝优惠券网站怎么做的百度代运营公司
  • 南阳网站seo推广公司网站设计流程
  • 衡水网站建设广州百度
  • 做网站哪些我要下载百度
  • 写出网站开发的基本流程万网域名查询
  • 公司的网站建设费用属于什么费中国疾控卫生应急服装
  • 仿网站制作教学视频企业门户网站的设计与实现
  • 成都网站建设公司排名代理公司注册
  • 镇江疾控紧急提醒爱站网seo工具包
  • 哪个网站做自媒体比较好西安自动seo
  • 邓州网站建设怎样策划一个营销型网站
  • win7 网站系统怎么做鹤壁seo
  • 长沙做网站一般多少钱合适win10优化大师好用吗
  • 政府机构的网站怎么做的那么差近三年成功的营销案例
  • 做个动态网站多少钱新冠疫苗接种最新消息
  • wordpress如何才能自己登陆进入自己的网站 进行修改呢360公司官网首页
  • 郑州睿网站建设安卓优化大师清理
  • 网站开发工作描述如何营销推广自己的产品
  • 独立做网站前后端百度网站收录查询
  • 专业网站建设电话营销技巧和营销方法培训
  • 做网站公司没签合同网络营销平台名词解释
  • 有什么网站可以做ppt市场推广专员
  • 精神文明建设专题网站seo优化与推广招聘
  • 给网站定位seo关键词优化软件合作
  • 公司如何建立微网站天津seo排名收费
  • 杭州百度推广seo自学网app
  • 十大进销存管理软件深圳市seo上词多少钱