题目描述
n个人排成一排,你排在第m个。每轮队首的人投一次骰子:
若掷到1,则队首的人获胜;
若掷到2,4,6,则队首的人排到队尾;
若掷到3,5,则队首的人出队。
获胜者仅有一人,若队列中仅剩一人,则该人获胜。求你获胜的概率。
输入格式
一行两个整数n,m
输出格式
一个实数表示获胜概率(精确到小数点后9位)
输入输出样例
输入 #1
2 1
输出 #1
0.375000000
说明/提示
【数据范围】
对于30%的数据:n<=10
对于100%的数据:n<=1000,m<=n
代码
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10010;
int n,m;
double f[N][N];
int main () {
scanf("%d%d",&n,&m);
f[1][1]=1;
for(int i=2; i<=n; i++) {
double x=(double)1/2,c=(double)1/6;
for(int j=2; j<=i; j++) {
x=x/2;
c=c/2+f[i-1][j-1]/3;
}
f[i][i]=c/(1-x);
f[i][1]=f[i][i]/2+(double)1/6;
for(int j=2; j<i; j++)
f[i][j]=f[i][j-1]/2+f[i-1][j-1]/3;
}
printf("%.9lf\n",f[n][m]);
return 0;
}