首页 > 其他分享 >《剑指Offer》-60-n 个骰子的点数

《剑指Offer》-60-n 个骰子的点数

时间:2023-08-24 22:23:29浏览次数:30  
标签:骰子 Offer int 60 次数 vector 点数 dp

打印出 n 个骰子所能扔出的所有点数的概率

思路

dp[i][j] 表示 i 个骰子,投出 j 的概率

而概率 = 点数出现的次数 / 总次数

而 i 个骰子掷出 j 的次数 = i - 1 个骰子掷出 j- 1 的次数 + i - 1 个骰子掷出 j -2 的次数 + … + i - 1 个骰子掷出 j -6 的次数,因为这个单独的骰子能掷出这 6 种结果,这里的 j - n 必须大于1

于是比如dp[2][3] = (dp[1][2]+dp[1][1])/6^2

	vector<double> dicesProbability(int n) {
		// dp[i][j]表示i个骰子掷出j的概率
		vector<vector<double>> dp(n+1, vector<double>(6*n+1,0));
		vector<double> res;
		// 那么我们要得到的就是dp[n][n]到dp[n][6n]
		// 如果转化为一个矩阵,那么整个右上角和左下角都是不要的
		// 初始化
		for (int i = 1; i <= 6; i++) dp[1][i] = 1.0 / pow(6,n);
		for (int i = 2; i <= n; i++) {
			for (int j = i; j <= 6*i; j++) {
				int k = j-1;
				while (k >= 1 && k>=j-6) {
					dp[i][j] += dp[i - 1][k];
					k--;
				}
			}
		}

		for (int i = n; i <= 6 * n; i++) res.push_back(dp[n][i]);
		return res;
	}

这是我想出最直观地做法,从 1 个骰子地所有情况开始向上递推,但是很明显套了三层循环,而且用了二维数组,时间和空间效率肯定都不好看,还好题目最大 n 也就 11,所以就接过来说还是看得下去的,但是肯定不能让面试官满意

这里的时间和空间复杂的其实是可以算出来的,3n(n+1)的时间复杂度和6n2的空间复杂度

通常二维动态规划都可以优化为一维,这里也不例外,每一层其实都只依赖上一层,但是……考虑到覆盖的情况也不能一个数组就搞定了吧

标签:骰子,Offer,int,60,次数,vector,点数,dp
From: https://www.cnblogs.com/yaocy/p/17622373.html

相关文章

  • 【剑指Offer】46、圆圈中最后剩下的数
    【剑指Offer】46、圆圈中最后剩下的数题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报......
  • 剑指 Offer 47. 礼物的最大价值(中等)
    题目:classSolution{public:intmaxValue(vector<vector<int>>&grid){if(grid.empty())return0;//要考虑棋盘为空的情况直接返回0vector<vector<int>>dp(grid.size(),vector(grid[0].size(),0));//定义一个和棋盘同样大小的dp......
  • 剑指 Offer 63. 股票的最大利润(中等)
    题目:classSolution{public:intmaxProfit(vector<int>&prices){if(prices.empty())return0;//要考虑数组为空的情况vector<vector<int>>dp(prices.size(),vector<int>(2,0));//确定动态数组大小和下表含义dp[i][j]:第i天j状态......
  • APT60DQ20BG-ASEMI新能源功率器件APT60DQ20BG
    编辑:llAPT60DQ20BG-ASEMI新能源功率器件APT60DQ20BG型号:APT60DQ20BG品牌:ASEMI封装:TO-3P恢复时间:>50ns正向电流:60A反向耐压:200V芯片个数:2引脚数量:3类型:快恢复二极管特性:插件快恢复二极管、大功率浪涌电流:300A正向压降:1.10V封装尺寸:如图工作温度:-55°C~150°CAPT60DQ......
  • 【剑指Offer】45、扑克牌顺子
    【剑指Offer】45、扑克牌顺子题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh......
  • 【剑指Offer】41、和为S的连续正数序列
    【剑指Offer】41、和为S的连续正数序列题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,......
  • 【剑指Offer】42、和为S的两个数字
    【剑指Offer】42、和为S的两个数字题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。解题思路:对于本题,比上一题简单一些。看到题目,我们的第......
  • 剑指 Offer 10- I. 斐波那契数列(简单)
    题目:classSolution{//动态规划public:intfib(intn){if(n<=1)returnn;vector<int>dp(2,0);//确定dp数组以及下标的含义dp[0]=0;//dp数组初始化dp[1]=1;for(inti=2;i<=n;i++){//递推顺序从......
  • 剑指 Offer 41. 数据流中的中位数(困难)
    题目:classMedianFinder{//暴力解法:每添加一个数字后用sort进行排序,然后返回中位数,时间复杂度:nlogn,会超时。因此采用**二分法查找并进行插入的方法**。时间复杂度:lognpublic:vector<int>nums;//初始化一个当前数组/**initializeyourdatastructure......
  • 2060:【例1.1】计算机输出
    2060:【例1.1】计算机输出时间限制:1000ms      内存限制:65536KB提交数:166481   通过数:83042【题目描述】在屏幕上输出“HelloWorld!”。【输入】(无)【输出】(无)【输入样例】(无)【输出样例】HelloWorld!#include<iostream>intmain......