问题
例子
思路
-
方法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 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