数据结构学习 jz60 n个骰子的点数

关键词:动态规划 滚动数组优化

这道题还是不难的,就是特别纠结要怎么优化这个存储空间以及动态规划的方法,因为我觉得这个方法好原始,最后决定不优化了。最后发现题解也是这个原始的样子,我就放心了。用时38min。

题目:

思路:

类似跳楼梯,一次可以跳1-6级。

dp状态:

dpij:第i次抛筛子,第j小的点数集合的概率。

转移方程:

dpij=(dpi-1j-1+dpi-1j-2+...+dpi-1j-6)*(1/6)【这里注意范围】

i-1次抛筛子的集合点数的概率*1/6

初始化:第一次抛骰子,所有点数的概率都是1/6

复杂度计算:

时间复杂度O(n^2)

空间复杂度O(n)

代码:

我的dp状态的长度是num*6+1,因为想要dp的索引对应点数的集合。

抛第i次的时候,最大的点数集合是i*6,最小的点数集合是i。

cpp 复制代码
class Solution {
public:
    vector<double> statisticsProbability(int num) {
        vector<double> dp(6*num+1,1.0/6);
        dp[0]=0;
        for(int i=2;i<=num;++i)
        {
            for(int j=i*6;j>=i;--j)
            {
                dp[j]=0;
                for(int z=1;z<=6;++z)
                {
                    if(j-z>=i-1&&j-z<=(i-1)*6)//从上一轮里面选
                        dp[j]+=dp[j-z];
                }
                dp[j]*=1.0/6;
            }
        }
        vector<double> res(num*5+1);
        int j=0;
        for(int i=num;i<=num*6;++i,++j)
        {
            res[j]=dp[i];
        }
        return res;
    }
};
相关推荐
传奇开心果编程9 小时前
【用案例学Material 3 Expressive】第1课:从一封邮件开始,感受安卓设计新语言的表现力
android·学习·ui·kotlin·android jetpack
sunoo-2299 小时前
【嵌入式 ARM 学习第十二天】SPI 裸机驱动 + I2C 触摸屏驱动 + 三大串行协议深度对比
arm开发·笔记·vscode·学习·imx6ull
墨心@9 小时前
第 4 章《工具》学习总结
学习·自然语言处理·prompt·agent·harness
hnjzsyjyj9 小时前
洛谷 P1339:[USACO09OCT] Heat Wave G ← Bellman-Ford 算法
数据结构·bellman-ford 算法
AOI小白新手上路9 小时前
4-1_地址空间_RISC与CISC_学习笔记
笔记·学习
Vcaker9 小时前
Linux学习36-k8s集群升级及kube-vip高可用
linux·运维·学习
probex_10 小时前
学习笔记:知识图谱落地实践
笔记·学习·知识图谱
AOI小白新手上路10 小时前
4-3_ARM汇编_学习笔记
汇编·arm开发·学习
kkkkkkkkkk_Z10 小时前
新手自学嵌入式 | 学习日记:ARM架构初探与基础概念梳理
arm开发·学习·架构
鬓戈10 小时前
开源中文输入法技术调研与自建方案
学习·开源