算法系列——n个骰子的点数(剑指offer)

这篇博客探讨了如何使用动态规划方法解决n个骰子投掷后点数和的各种可能性及其出现概率。作者从题目描述出发,详细解释了解题思路,包括状态转移方程的建立,并给出了代码实现。
摘要由CSDN通过智能技术生成

题目描述

题目链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof/
把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 s。输入 n,打印出 s 的所有可能的值出现的概率。

解题思路

此题目解法很多,其中使用动态规划法最好理解,代码也比较简洁

1.现在变量有:骰子个数,点数和。当有c个骰子,点数和为k时,出现次数记为dp(c,k)。那与c-1个骰子阶段之间的关系是怎样的?
2.当我有c-1个骰子时,再增加一个骰子,这个骰子的点数只可能为1、2、3、4、5或6。那k个骰子得到点数和为n的情况有:

(c-1,k-1):第c个骰子投了点数1
(c-1,k-2):第c个骰子投了点数2
(c-1,k-3):第c个骰子投了点数3
....
(c-1,k-6):第c个骰子投了点数6

在c-1个骰子的基础上,再增加一个骰子出现点数和为k的结果只有这6种情况!
所以:dp(c,k)=dp(c-1,k-1)+dp(c-1,k-2)+dp(c-1,k-3)+dp(c-1,k-4)+dp(c-1,k-5)+dp(c-1,k-6)(注意当k<6时的处理越界问题)
3.有1个骰子,dp(1,1)=dp(1,2)=dp(1,3)=dp(1,4)=dp(1,5)=dp(1,6)=1。

因此状态转移方程为

dp[c][k]=sum(dp[c-1][k-m])(1<=m<=6&&m<k)

程序实现

public class Solution {
   
    public String[] printProbability(int n) {
   
        if (n <= 0)
            return null;
        //结果可能性总数
        
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值