期望DP转移,正着来。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=110;
const double eps=1e-8;
const double INF=1e100;
double prob[10][MAXN],suc[10],c[MAXN],dp[10][MAXN];
int lose[10][MAXN];
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
scanf("%lf",&c[i]);
for(i=1;i<=7;i++)
for(j=1;j<=n;j++)
scanf("%lf",&prob[i][j]);
for(i=1;i<=7;i++)
for(j=1;j<=n;j++)
scanf("%d",&lose[i][j]);
suc[0]=0;
for(i=1;i<=7;i++)
{
for(j=1;j<=n;j++)
{
if(prob[i][j]<eps)
dp[i][j]=INF;
else
dp[i][j]=suc[i-1-lose[i][j]]+(c[j]+suc[i-1]-suc[i-1-lose[i][j]])/prob[i][j];
}
suc[i]=INF;
for(j=1;j<=n;j++)
suc[i]=min(dp[i][j],suc[i]);
if(suc[i]==INF)
{
suc[7]=INF;
break;
}
}
if(suc[7]==INF)
printf("-1\n");
else
printf("%.10f\n",suc[7]);
}
}