题目
题解
用 f[i]表示 i颗星的最小期望
从第 i−1个点转移到i,若成功概率为 p,失败后退 l格,那么
p⋅f[i]+(1−p)⋅f[i−i−l]=f[i−1]+c[j]
#include<bits/stdc++.h>
using namespace std;
double c[102],f[8],p[8][102];
int l[8][102],fl,i,j,n;
int main(){
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%lf",&c[i]);
for (i=1;i<=7;i++){
fl=0;
for (j=1;j<=n;j++) scanf("%lf",&p[i][j]),fl|=p[i][j]>1e-6;
if (!fl){
puts("-1");
return 0;
}
}
for (i=1;i<=7;i++)
for (j=1;j<=n;j++) scanf("%d",&l[i][j]);
for (i=1;i<=7;i++) f[i]=1e99;
for (i=1;i<=7;i++)
for (j=1;j<=n;j++)
if (p[i][j]>1e-6) f[i]=min(f[i],(f[i-1]+c[j]-(1-p[i][j])*f[i-1-l[i][j]])/p[i][j]);
printf("%.9lf",f[7]);
}