この質問の場合、考えられるアイデアは、直接合計して回数を見つけることです。これは、最も直接的で面倒な方法です。
次に、答えを直接調べました。答えのアイデアは、配列を使用して各サイコロに対応する合計の数を格納し、次回はf(n-1)+ f(n-2)を使用することです。 + f(n-3)+ f(n-4)+ f(n-5)+ f(n-6)は、値と現在のサイコロを取得します
自分で書いたコード
public double[] dicesProbability(int n) {
int[] pre_sum = new int[7];
int[] la_sum = null;
double total = 1;
for(int count = 0;count<n;count++){
total*=6;
}
pre_sum[0] = 0;
pre_sum[1] = 1;
pre_sum[2] = 1;
pre_sum[3] = 1;
pre_sum[4] = 1;
pre_sum[5] = 1;
pre_sum[6] = 1;
la_sum = pre_sum;
for(int count = 2; count<=n;count++){
pre_sum = la_sum;
la_sum = new int[count*6 + 1];
for(int inner_count = 0;inner_count < la_sum.length;inner_count++){
for(int count_6 = 1;count_6<=6;count_6++){
if(inner_count - count_6>=0&&inner_count - count_6<pre_sum.length){
la_sum[inner_count] += pre_sum[inner_count - count_6];
}
}
}
}
double[] la_rate = new double[la_sum.length];
int num_count = 0;
for(int count = 0;count<la_sum.length;count++){
la_rate[count] = la_sum[count]/total;
if(la_sum[count]>0){
num_count++;
}
}
double[] la_rate_new = new double[num_count];
int count_out = 0;
for(int count = 0;count<la_sum.length;count++){
if(la_sum[count]>0){
la_rate_new[count_out++] = la_rate[count];
}
}
return la_rate_new;
}