首页 > 其他分享 >1223. 掷骰子模拟

1223. 掷骰子模拟

时间:2023-04-08 23:12:25浏览次数:36  
标签:1223 rollMax int cache 掷骰子 long last 模拟 left

题目链接:1223. 掷骰子模拟

方法:回溯 + 记忆化搜索

解题思路

  1. 回溯要点
  • 参数列表
    根据题目中的操作确定在递归中需要用到的上一层的某个变量或性质。
  • 递归边界
    即递归的最底层,确定其返回值。
  1. 记忆化搜索
    由于在递归中会重复计算某一状态的值,那么我们在第一次计算出来后将其保存在数组中,再下一次遇到该状态时直接取出数值即可。

代码

class Solution {
private:
    const long long MOD = 1e9 + 7;
public:
    int dieSimulator(int n, vector<int>& rollMax) {
        int m = rollMax.size(), cache[n][m][15];
        memset(cache, -1, sizeof(cache));
        function<int(int, int, int)> dfs = [&](int i, int last, int left) -> int {
            if (i == 0) return 1;
            if (cache[i][last][left] != -1) return cache[i][last][left];
            long long res = 0;
            for (int j = 0; j < m; j ++ ) {
                if (j != last) res += dfs(i - 1, j, rollMax[j] - 1);
                else if (left) res += dfs(i - 1, last, left - 1);
            }
            cache[i][last][left] = res % MOD;
            return res % MOD;
        };
        long long ans = 0;
        for (int j = 0; j < m; j ++ ) {
            ans += dfs(n - 1, j, rollMax[j] - 1) % MOD;
        }
        return ans % MOD;
    }
};

复杂度分析

时间复杂度:\(O(nmS),S = \sum rollMax\);
空间复杂度:\(O(nS)\)。

标签:1223,rollMax,int,cache,掷骰子,long,last,模拟,left
From: https://www.cnblogs.com/lxycoding/p/17299509.html

相关文章

  • 基于matlab模拟雷达信号检测中的恒虚警处理方法(慢门限和快门限)
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 基于Matlab模拟圆周阵列天线
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 数组模拟环形队列的思路及代码
    JAVA实现数组模拟环形队列的思路及代码前言在对Java实现数组模拟队列零了解的情况下,建议先去阅读《JAVA实现数组模拟单向队列的思路及代码》一文,可以辅助理解本文核心思想。一、环形数组队列实现:让数组达到复用的效果,即:当我们从数组队列中取出了数据,那取出数据后后这个空间可......
  • 数组模拟单向队列的思路及代码
    JAVA实现数组模拟单向队列的思路及代码一、什么是队列?队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称......
  • C/C++模拟ATM机存取款管理系统[2023-04-07]
    C/C++模拟ATM机存取款管理系统[2023-04-07]2、模拟ATM机存取款管理系统模拟银行的自动取款机使用过程中的界面和用户交互过程。实现查询银行卡余额、取款修改密码、退出系统等功能。(一)功能要求及说明:(1)将银行账户的卡号,户名,密码和账户余额从外部文件(银行账户.txt)中读入......
  • 模拟循环批量请求后台接口
    使用async,await处理异步请求。用Promise,setTimeout函数模拟后台接口<!DOCTYPEhtml><html><scripttype="text/javascript">vararr=[];varbatchSize=10;for(i=0;i<30;i++){arr.push(i);}functionb(startIdx,endIdx){ returnnewPromise((res......
  • 邮箱密码-2020模拟
    【题目描述】小明的电子邮箱密码忘记了。请你帮他找出密码。他零星记得密码的信息如下:1)密码是六位数字,前面两位是31;2)最后两位数字相同;3)能被16和46整除;请你找出所有可能的密码并统计个数。【评分标准】30分︰正确打印出一组符合的六位数(程序不报错);80分∶在满足30基础......
  • JS 模拟鼠标事件mouse over、click
     <!DOCTYPEhtml><html><head><metacharset="utf-8"><metahttp-equiv="content-type"content="text/html;charset=utf-8"><metaname="renderer"content="webkit&quo......
  • 4.6 模拟赛小记
    小寄,嘿嘿,嘿嘿。T1猴子选大王首先声明我是智障,然后本题时根据子任务分开解决。对于第一个子任务,可以看一下[luoguP8671约瑟夫环](https://www.luogu.com.cn/problem/P8671),用f存当前所选个数下的答案下标,易推得公式f[i]=(f[i-1]+m)%i。怎么推得?正难则反,不妨设想......
  • 游戏模拟——Position based dynamics
    目录Verlet积分基本积分方法Verlet算位置Verlet算速度PBD基于力的方法解碰撞过冲问题基于位置的方法解碰撞算法流程求解器借用的思想关于动量守恒约束投影简单约束举例计算机图形中动态系统模拟最流行的方法是基于力的。累积内部和外部力量,根据牛顿的第二个运动定律计算加速度......