期望DP
f [ i ] [ a ] [ b ] [ c ] f[i][a][b][c] f[i][a][b][c]表示还剩下 i i i次攻击,场上奴隶主的数量分别为 a , b , c a,b,c a,b,c时对英雄造成伤害的期望。
然后瞎JB转移就好了。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 55
#define M 10
using namespace std;
typedef double DB;
int t,k,a,b,c; DB f[N][M][M][M];
void calc(){
for (int i=0;i<50;i++)
for (int a=0;a<8;a++)
for (int b=0;a+b<8;b++)
for (int c=0;a+b+c<8;c++){
DB &x=f[i+1][a][b][c],sum=a+b+c,p=1/(sum+1);
if (a) x+=f[i][a-1][b][c]*a*p;
if (b) x+=f[i][a+1][b-1][c+(sum<7)]*b*p;
if (c) x+=f[i][a][b+1][c-(sum==7)]*c*p;
x+=(f[i][a][b][c]+1)*p;
}
}
int main(){
for (calc(),scanf("%d",&t);t;t--){
scanf("%d%d%d%d",&k,&a,&b,&c);
printf("%.2lf\n",f[k][a][b][c]);
}
return 0;
}