剑指 Offer 60. n个骰子的点数

 

思路#

方法:动态规划#

用dp[i][j]表示掷完 i 个骰子之后其点数之和为 j 的总次数,这可以由

投掷完 n-1 枚骰子后,对应点数 j-1, j-2, j-3, ... , j-6 出现的次数之和转化过来。

 

即:

 

复制代码
 1 class Solution {
 2 public:
 3     vector<double> dicesProbability(int n) {
 4         vector<vector<int>> dp(n+1, vector<int>(6*n+1, 0));
 5         
 6         for(int i = 1; i <= 6; ++i) {
 7             dp[1][i] = 1;
 8         }
 9 
10         for(int i = 2; i <= n; ++i) {
11             //i个骰子能抛出的点数之和最小为i,最大为6*i
12             for(int j = i; j <= 6*i; ++j) {
13                 for(int k = 1; k <= 6; ++k) {
14                     if(j - k <= 0) break;
15                     dp[i][j] += dp[i-1][j-k];
16                 }
17             }
18         }
19 
20         int total = pow(6, n);
21         vector<double> res;
22         for(int i = n; i <= 6*n; ++i) {
23             res.push_back(dp[n][i] * 1.0 / total);
24         }
25 
26         return res;
27     }
28 };
复制代码

复杂度分析#

时间复杂度:O(n2)

空间复杂度:O(n*6*n)

 

空间优化:#

复制代码
 1 class Solution {
 2 public:
 3     vector<double> dicesProbability(int n) {
 4         vector<int> dp(6*n+1, 0);
 5 
 6         for(int i = 1; i <= 6; ++i) {
 7             dp[i] = 1;
 8         }
 9 
10         for(int i = 2; i <= n; ++i) {
11             for(int j = 6*i; j >= i; --j) {
12                 dp[j] = 0;  //dp[j]表示前i个骰子点数之和为j的次数
13                 for(int k = 1; k <= 6; ++k) {
14                     if(j-k < i-1) break;    //前i-1个骰子点数之和最小为i-1
15                     dp[j] += dp[j-k];       //所以这里只需要加到前一轮的最小和
16                 }
17             }
18         }
19 
20         int total = pow(6, n);
21         vector<double> res;
22         for(int i = n; i <= 6*n; ++i)
23             res.push_back(dp[i] * 1.0 / total);
24         
25         return res;
26     }
27 };
复制代码

复杂度分析#

时间复杂度:O(n2)

空间复杂度:O(6*n)

posted @   拾月凄辰  阅读(142)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示
主题色彩