设
但是这个转移是带环的,不能直接做。把
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=110,m=7;
const double oo=1e16;
int c[maxn],l[m+5][maxn],n;
double p[m+5][maxn],dp[m+5][m+5];
int main()
{
int ok;
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&c[i]);
for (int i=1;i<=m;i++)
{
ok=0;
for (int j=1;j<=n;j++)
{
scanf("%lf",&p[i][j]);
if (p[i][j]>1e-5) ok=1;
}
if (!ok)
{
printf("-1\n");
return 0;
}
}
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
scanf("%d",&l[i][j]);
for (int i=1;i<=m;i++)
for (int j=i-1;j>=0;j--)
{
dp[j][i]=oo;
for (int k=1;k<=n;k++)
dp[j][i]=min(dp[j][i],c[k]/p[j+1][k]+dp[j+1][i]+(1-p[j+1][k])/p[j+1][k]*dp[j-l[j+1][k]][j]);
}
printf("%.10f\n",dp[0][m]);
}