剑指 Offer 60. n个骰子的点数 + 动态规划 + 空间优化
剑指 Offer 60. n个骰子的点数
Offer_60
题目详情
题解分析
package com.walegarrett.offer;
/**
* @Author WaleGarrett
* @Date 2021/2/12 18:29
*/
/**
* 题目描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
* 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
*/
import java.util.Arrays;
/**
* 动态规划:dp[i][j]表示掷n个骰子后,点数总和为j出现的次数
*/
public class Offer_60 {
public double[] dicesProbability(int n) {
int[][] dp = new int[n+1][70];
for(int i=1; i<=6; i++){
dp[1][i] = 1;
}
for(int i=2; i<=n; i++){
for(int j=i; j<=6*i; j++){
for(int k=1; k<=6 && j-k>0; k++)
dp[i][j] += dp[i-1][j-k];
}
}
double allP = Math.pow(6,n);
double[] result = new double[6*n-n+1];
for(int i=n; i<=6*n; i++){
result[i-n] = dp[n][i] * 1.0 / allP;
}
return result;
}
}
空间优化
/**
* 动态规划:空间优化
*/
class Offer_60_1 {
public double[] dicesProbability(int n) {
int[] dp = new int[70];
Arrays.fill(dp,0);
for(int i=1; i<=6; i++){
dp[i] = 1;
}
for(int i=2; i<=n; i++){
for(int j=6*i; j>=i; j--){
dp[j] = 0;//很重要
for(int k=1; k<=6 && j-k>=i-1; k++)
dp[j] += dp[j-k];
}
}
double allP = Math.pow(6,n);
double[] result = new double[6*n-n+1];
for(int i=n; i<=6*n; i++){
result[i-n] = dp[i] * 1.0 / allP;
}
return result;
}
}
题解参考:【n个骰子的点数】:详解动态规划及其优化方式
Either Excellent or Rusty
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了