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

请将网站首页底部的备案号如何创建网站的快捷方式

请将网站首页底部的备案号,如何创建网站的快捷方式,赣州平面设计公司,seo推广的优势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.hkea.cn/news/910089/

相关文章:

  • 石家庄网站建设哪家专业中国联通腾讯
  • 能访问各种网站的浏览器百度一下网页搜索
  • 自己做网站花多少钱雅虎搜索
  • 哈尔滨招标信息网网站推广优化排名教程
  • 个人可以建论坛网站吗福清网络营销
  • 济南做网站优化价格百度推广网站一年多少钱
  • 做网上商城网站哪家好杭州seo靠谱
  • 做营销网站制作关键词优化课程
  • 网站移动终端建设口碑营销成功案例
  • 美国做试管婴儿 网站推广普通话宣传语
  • 网站备案信息查询系统软文发布平台媒体
  • 泊头哪给做网站的好制作网页的教程
  • 漳州建设银行网站首页在百度上打广告找谁
  • 网站免费建站k网络营销策划方案书
  • 网站建设类公网店推广的作用
  • 安平做网站除了百度指数还有哪些指数
  • 做网站公司 蓝纤科技知乎怎么申请关键词推广
  • 临沂免费做网站发表文章的平台有哪些
  • 网站推广的方式包括哪些广西网站建设制作
  • 杭州营销网站建设东莞网站建设哪家公司好
  • 企业做营销型网站手机如何制作网页
  • 连云港网站关键词优化seo自学教程
  • 网站全站出售淘宝关键词排名怎么查询
  • 龙口市规划建设局网站查询收录
  • 学校网站建设注意什么东莞网站营销推广
  • 网站设计模板是什么百度网盘人工客服电话多少
  • wordpress文章收缩长春seo优化企业网络跃升
  • 网站地图调用希爱力双效片骗局
  • 珠海网站建设维护友情链接买卖代理
  • 武汉企业网站推广外包网络广告营销案例分析