【LeetCode笔记】剑指 Offer 60. n个骰子的点数(Java、动态规划)

文章目录

  • 题目描述
  • 代码 & 思路
      • 1. 二维数组(方便理解)
      • 2. 一维数组(节约空间)
      • 二刷

鸽了好久的打题博客~要继续补起来了!
今天不打题,明天变垃圾 QAQ

题目描述

  • 一眼就想先暴力枚举、或者递归呀~但是貌似会超时,这里就直接用dp了
  • 参考题解
  • 主要思路有点像跳台阶,也就是用上一轮次的和,来维护当前轮次的值
    在这里插入图片描述

代码 & 思路

1. 二维数组(方便理解)

  • 举个例子吧:两个骰子得出来的值8,相当于:
    1. 一个骰子的2,再补上另一个的6
    2. 一个骰子的3,再补上另一个的5
    3. 一个骰子的4,再补上另一个的4
    4. 一个骰子的5,再补上另一个的3
    5. 一个骰子的6,再补上另一个的2
    6. 当然,一个骰子的1,再补上另一个的7 这种情况是不存在的,所以只有5种情况可行。
      也就是说 dp[2][8] = dp[1][2] + dp[1][3] + dp[1][4] + dp[1][5]+ dp[1][6]
  • 按照这么一个思路,我们就可以得出下面的代码:
class Solution {public double[] dicesProbability(int n) {// 第一行、最后一列舍弃,方便下标理解// dp[骰子数][可投出点数] = 对应次数double[][] dp = new double[n + 1][6 * n + 1];// 初始化for(int i = 1; i <= 6; i++) {dp[1][i] = 1;}// dp 过程for(int i = 2; i <= n; i++) {// 范围[i, 6 * i]for(int j = i; j <= 6 * i; j++) {// 取上一层的前6个for(int k = 1; k <= 6; k++) {// 取不到6个则有多少取多少if(j - k <= 0) {break;}// 状态转移方程 dp[i][j] += dp[i - 1][j - k];}}}// 结束,取答案double all = Math.pow(6, n);double[] ans = new double[5 * n + 1];for(int i = 0; i < ans.length; i++) {ans[i] = dp[n][i + n] / all;}return ans;}
}

2. 一维数组(节约空间)

  • 在上一个方法的基础上,我们知道:第 n 轮的值,只和第 n - 1 轮的值相关
  • (还是得去上面链接的题解结合动图理解
  • 经过思考,可以发现其实按照从后往前的顺序进行数组更新,就只需要一维数组即可:
  • 举个例子(实际还是1维,这里的行值是辅助了解当前状态):
    1. dp[2][12] = dp[1][11] + dp[1][10] + … + dp[1][6]
    2. dp[2][11] = dp[1][10] + dp[1][9] + … + dp[1][5]
    3. dp[2][2] = dp[1][1]
    4. 这也就是需要从后往前的原因,如果从前往后的话,dp[2][12]就取不到dp[1][11]的值了。从后往前可以实现无后效性~
  • 那么进行一个空间上的优化,可以得到以下代码:
class Solution {public double[] dicesProbability(int n) {// 0 下标不取,一共 6 * n 个格子double[] dp = new double[6 * n + 1];// 初始化,全为1for(int i = 1; i <= 6; i++) {dp[i] = 1;}// 2个、3个...n个骰子,以此类推for(int i = 2; i <= n; i++) {// 从后往前,可推n个骰子范围[n, 6 * n]for(int j = 6 * i; j >= i; j--) {// 给新的格子赋值dp[j] = 0;// 获取前六个格子的值(类似走楼梯)for(int k = 1; k <= 6; k++) {// 过于倒退的情况,结束(不一定都能取6个)if(j - k < i - 1) {break;}// 累加前面的格子值dp[j] += dp[j - k];}}}// 获取答案double all = Math.pow(6, n);double[] ans = new double[5 * n + 1];for(int i = 0; i < ans.length; i++) {ans[i] = dp[n + i] / all;}return ans;}
}

二刷

  • O(n2n^2n2)、O(n2n^2n2)
class Solution {public double[] dicesProbability(int n) {// 1. dp初始化int[][] ans = new int[n + 1][6 * n + 1];for(int i = 1; i <= 6; i++) {ans[1][i] = 1;}// 2. dp 过程 O(n^2)for(int i = 2; i <= n; i++) {for(int j = i; j <= i * 6; j++) {for(int k = 1; k <= 6 && j - k >= i - 1; k++) {ans[i][j] += ans[i - 1][j - k];}}}// 3. 获取答案double[] myAns = new double[5 * n + 1];for(int i = 0; i < myAns.length; i++) {myAns[i] = ans[n][i + n] / Math.pow(6, n);;}return myAns;}
}
  • O(n2n^2n2)、O(nnn)
class Solution {public double[] dicesProbability(int n) {// 1. dp初始化int[] ans = new int[6 * n + 1];for(int i = 1; i <= 6; i++) {ans[i] = 1;}// 2. dp 过程 O(n^2)for(int i = 2; i <= n; i++) {for(int j = 6 * i; j >= i; j--) {ans[j] = 0;for(int k = 1; k <= 6 && j - k >= i - 1; k++) {ans[j] += ans[j - k];}}}// 3. 获取答案double[] myAns = new double[5 * n + 1];for(int i = 0; i < myAns.length; i++) {myAns[i] = ans[i + n] / Math.pow(6, n);;}return myAns;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 根据圆心计算圆弧上点的经纬度_【控制测量学】-高斯投影正算公式以及java代码

正算公式(将经纬度转化为坐标):java代码(附有源代码和修改后的代码):源代码:/** * 由经纬度反算成高斯投影坐标 * * param longitude * param latitude * return */ public static double[] GaussToBLToGauss( double longitude, double latitude) { …

【LeetCode笔记】剑指 Offer 59 - II. 队列的最大值(Java、辅助队列)

文章目录题目描述思路 && 代码二刷题目描述 恢复打题的第二天打卡&#xff5e; 可以说是这道最小栈的兄弟题目了&#xff0c;很相似总体思路还是一样&#xff0c;靠空间换时间&#xff5e;也就是借助辅助队列 思路 && 代码 这篇题解的动图做得很好&#xff…

redis setnx原子性_不支持原子性的 Redis 事务也叫事务吗?

文章收录在 GitHub JavaKeeper &#xff0c;N线互联网开发必备技能兵器谱 假设现在有这样一个业务&#xff0c;用户获取的某些数据来自第三方接口信息&#xff0c;为避免频繁请求第三方接口&#xff0c;我们往往会加一层缓存&#xff0c;缓存肯定要有时效性&#xff0c;假设我们…

【LeetCode笔记】剑指 Offer 67. 把字符串转换成整数 (Java、字符串)

文章目录题目描述思路 && 代码二刷题目描述 老阅读题了&#xff0c;感觉这道题有点类似写业务接口。 思路 && 代码 首先&#xff0c;把情况划分一下&#xff1a; 非正常值&#xff0c;直接给 0&#xff08;这个实际上可以划分到2的代码中&#xff09;可取…

详细描述三个适于瀑布模型的项目_信息系统项目管理师-第二三章:信息系统项目管理基础与立项管理2...

三、信息系统项目的生命周期1、项目生命周期的定义—项目从启动、组织与准备、执行到结束所经历的一系列阶段2、★项目生命周期的特征①成本与人力投入在开始时较低,在工作执行期间达到最高,并在项目快要结束时迅速回落②风险与不确定性在项目开始时最大,并在项目的整个生命周期…

【LeetCode笔记】剑指 Offer 64. 求1 + 2 + ... + n (Java、限制语法、二刷)

文章目录题目描述思路 && 代码注释版代码&#xff08;方便理解&#xff09;&#xff1a;无注释版代码&#xff08;方便背诵 &#xff09;二刷题目描述 鬼鬼&#xff0c;又到了我最喜欢的戴着脚镣跳舞环节。 讲道理&#xff0c;我觉得这类题应该整个归纳啥的。。&#x…

虚拟dom_从0到1实现一个虚拟DOM

来源 | https://segmentfault.com/a/1190000021331850要构建自己的虚拟 DOM&#xff0c;需要知道两件事。你甚至不需要深入 React 的源代码或者深入任何其他虚拟 DOM 实现的源代码&#xff0c;因为它们是如此庞大和复杂——但实际上&#xff0c;虚拟 DOM 的主要部分只需不到 50…

【LeetCode笔记】剑指 Offer 31. 栈的压入、弹出序列 (Java、栈)

文章目录题目描述代码 && 思路二刷题目描述 打卡第三天&#xff01;加油加油&#xff5e; 数据结构笔试题貌似也会考 &#xff0c;不过考法不一样&#xff0c;有点规律。总的来说还是挺有意思的&#xff0c;我们直接来看代码吧&#xff5e; 代码 && 思路 O(…

【LeetCode笔记】剑指 Offer 20. 表示数值的字符串(Java、字符串)

文章目录题目描述思路 && 代码题目描述 呃…比较恶心的一道题&#xff0c;需要读好题&#xff0c;分完情况再下手有看到dalao用有限状态机来做&#xff0c;不过这边还是直接用了我自己的做法 思路 && 代码 ps&#xff1a;这里没有参考题解的写法&#xff…

【LeetCode笔记】剑指 Offer 16. 数值的整数次方(Java、分治)

文章目录题目描述思路 && 代码二刷题目描述 很棒的题目&#xff01;便于分治思想的理解&#xff01; 思路 && 代码 分情况是大头&#xff5e;递归结束的情况&#xff1a; x0x^0x0 1x1x^1x1 xx−1^-1−1 1 / x 偶数情况&#xff1a;直接二分递归奇数情况…

网站域名解析端口_环境测试必备,无需注册域名,免费动态IP解析一键解析本地网站...

localtunnel是基于Nodejs 开发的一个工具&#xff0c;开发者同时提供了Go语言版本。这个工具可以提供给你一个随机生成的二级域名&#xff0c;动态域名解析到你执行这个命令的服务器上&#xff0c;可以将域名解析到指定端口上。而且只需要一行代码。localtunnel安装在安装这个工…

【LeetCode笔记】剑指 Offer 33. 二叉树的后序遍历序列(Java、递归、栈)

文章目录题目描述思路 && 代码1. 递归做法2. 辅助栈做法二刷打卡第四天&#xff5e;昨天没来得及写博客 题目描述 无须多言&#xff0c;直接冲思路吧&#xff01; 思路 && 代码 1. 递归做法 缺点&#xff1a;最差情况下&#xff0c;可能会退化成链表&…

LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)

文章目录题目描述思路 && 代码1. 哈希表法2. 原地算法二刷题目描述 主要有两个考虑点&#xff1a; 不能改变原链表新链表赋予 next、random 时&#xff0c;复制结点不一定存在 思路 && 代码 1. 哈希表法 O(n)、O(n)参考了dalao的写法&#xff0c;这里哈希表…

adam算法效果差原因_干货|快来get中央空调冬天制热效果差的十大原因!

作为调节室内温度的重要电器&#xff0c;中央空调在人们的生活中扮演着至关重要的角色。目前&#xff0c;市场上许多中央空调都是冷暖两用型&#xff0c;每到冬季&#xff0c;绝大部分家用中央空调都被纷纷派上用场&#xff1b;然而&#xff0c;有些用户在使用空调制热时&#…

linux查看日志命令_查看log日志基础命令

一.tail命令tail -f test.log 可以动态的查看服务器运行状态的日志head -n 5 test.log 显示top 5行tail -n 5 test.log 显示last 5行tail -n 5 test.log 从第5行开始显示&#xff0c;显示第5行以后的二.cat 命令cat 文件名 | head -n 数量,查看log.log前200行cat log.log | hea…

【LeetCode笔记】剑指 Offer 36. 二叉搜索树与双向链表(Java、二叉树、链表、原地算法)

文章目录题目描述思路 && 代码1. 非原地算法2. 原地算法二刷题目描述 谈到二叉搜索树&#xff0c;那就得考虑考虑中序遍历啦&#xff5e;这道题对中序遍历的理解提升很有好处&#xff01; 思路 && 代码 1. 非原地算法 最简单的做法&#xff0c;依赖Array…

sqlserver2000给账户授予所有的权限_内网渗透 | 域内权限解读

域内权限解读目录域本地组全局组通用组A-G-DL-P策略内置组几个比较重要的域本地组几个比较重要的全局组、通用组的权限域本地组多域用户访问单域资源(访问同一个域)可以从任何域添加用户账户、通用组和全局组&#xff0c;但只能在其所在域内指派权限。域本地组不能嵌套于其他组…

【LeetCode笔记】剑指 Offer 38. 字符串的排列(Java、字符串、DFS)

文章目录题目描述思路 && 代码二刷打卡第五天&#xff5e; 题目描述 和这道题很相似&#xff0c;只是数据结构不同 思路 && 代码 DFS 辅助访问数组 Set 减枝通过 Set 实现去重 class Solution {Set<String> res new HashSet<>();char[] ar…

lombok依赖_使用Lombok 前你需要知道这些

转自&#xff1a;树下魅狐链接&#xff1a;https://ramostear.com/blog/2020/04/28/uk1860p8.html不得不承认&#xff0c;Lombok 是一个很不错的 Java 库&#xff0c;它可以让你在少写代码的同时耍耍酷&#xff0c;简单的几个注解&#xff0c;就可以干掉一大片模板代码。但是&a…

【LeetCode笔记】剑指 Offer 45. 把数组排成最小的数(Java、字符串、Lambda)

文章目录题目描述思路 && 代码二刷题目描述 很 nice 的一道题&#xff01;花的时间也不会很多&#xff0c;还能复习复习 Lambda&#xff5e; 思路 && 代码 核心思路&#xff1a;如果 x y > y x&#xff0c;说明 x 应该在 y 前面时间复杂度&#xff1a…