题目描述
有三个骰子,分别有k1,k2,k3个面。
每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。
当分数大于n时结束. 求游戏的期望步数. 初始分数为0
表示已经有了 i 分, 到 n 的期望步数
发现 每个 f 都可以用 f[0] 来表示
不妨设 , 带到上面
递推到最后一步时, 解出 f[0] 就是答案
#include<bits/stdc++.h>
#define N 550
using namespace std;
int T, n, k1, k2, k3, a, b, c;
double p[20], A[N], B[N];
int main(){
scanf("%d", &T);
while(T--){
scanf("%d", &n);
scanf("%d%d%d%d%d%d", &k1, &k2, &k3, &a, &b, &c);
p[0] = 1.0 / (k1 * k2 * k3);
for(int i=1; i<=k1; i++) for(int j=1; j<=k2; j++)
for(int k=1; k<=k3; k++) p[i + j + k] += p[0];
p[a + b + c] -= p[0];
for(int i=0; i<=n; i++) A[i] = B[i] = 0;
for(int i=n; i>=0; i--){
for(int j=3; j<=k1+k2+k3, i+j <= n; j++){
A[i] = A[i + j] * p[j];
B[i] = B[i + j] * p[j];
} A[i] += p[0]; B[i] += 1;
} printf("%.12lf\n", B[0] / (1 - A[0]));
} return 0;
}