问题

例子

思路
-
方法1
f ( n , j ) : n 个 筛 子 , 和 为 j 的 情 况 的 个 数 当 j > 6 时 : 因 为 一 个 骰 子 有 六 个 点 , 第 n 个 骰 子 可 能 出 现 1 到 6 的 点 。 所 以 第 n 个 骰 子 点 数 为 1 时 , f ( n , j ) = f ( n − 1 , j − 1 ) , 当 第 n 个 骰 子 点 数 为 2 的 话 , f ( n , j ) = f ( n − 1 , j − 2 ) , … , 依 次 类 推 f ( n , j ) = f ( n − 1 , j − 1 ) + f ( n − 1 , j − 2 ) + f ( n − 1 , j − 3 ) + f ( n − 1 , j − 4 ) + f ( n − 1 , j − 5 ) + f ( n − 1 , j − 6 ) j 有 可 能 < 6 , 所 以 f o r ( i n t k = 1 ; k < = 6 ; k + + ) i f ( j > k ) d p [ i ] [ j ] + = d [ i − 1 ] [ j − k ] 初 始 状 态 下 : d p [ 1 ] [ 1 − > 6 ] = 1 f(n,j):n个筛子,和为j的情况的个数\\ 当j>6时:因为一个骰子有六个点,第n个骰子可能出现1到6的点。所以第n个骰子点数为1时,f(n,j)=f(n-1,j-1),当第n个骰子点数为2的话,f(n,j)=f(n-1,j-2),…,依次类推\\ f(n,j)=f(n-1,j-1)+f(n-1,j-2)+f(n-1,j-3)+f(n-1,j-4)+f(n-1,j-5)+f(n-1,j-6)\\ j有可能<6,所以\\ for(int k=1; k<=6; k++) ~~ if(j>k)~~ dp[i][j]+=d[i-1][j-k]\\ 初始状态下:dp[1][1->6]=1 f(n,j):n个筛子,和为j的情况的个数当j>6时:因为一个骰子有六个点,第n个骰子可能出现1到6的点。所以第n个骰子点数为1时,f(n,j)=f(n−1,j−1),当第n个骰子点数为2的话,f(n,j)=f(n−1,j−2),…,依次类推f(n,j)=f(n−1,j−1)+f(n−1,j−2)+f(n−1,j−3)+f(n−1,j−4)+f(n−1,j−5)+f(n−1,j−6)j有可能<6,所以for(intk=1;k<=6;k++) if(j>k) dp[i][j]+=d[i−1][j−k]初始状态下:dp[1][1−>6]=1 -
方法2
$$$$
代码
//方法1
class Solution {
public double[] twoSum(int n) {
int[][] dp = new int[n+1][6*n+1];
//n~6*n 共有6n-n+1==5n+1
double[] res = new double[5*n+1];
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; k++){
if(j>k)
dp[i][j]+=dp[i-1][j-k];
}
}
}
double all = Math.pow(6,n);
for(int i=n; i<=6*n; i++) {
res[i-n]=dp[n][i]/all;
}
return res;
}
}
//方法2
该博客主要介绍了如何解决一道面试题——计算n个骰子投掷后点数之和的各种情况。通过两种方法进行解析,包括递归公式推导和动态规划实现,给出了具体的代码实现思路。
1040

被折叠的 条评论
为什么被折叠?



