51nod1705 七星剑

来源:互联网 发布:java获取map中的泛型 编辑:程序博客网 时间:2024/06/07 05:09

dp[i][j]表示现在已经有了i个星,要增加到j个星的期望花费。枚举某一种珠子,我们有

dp[i][j]=max{cost+pdp[i+1][j]+(1p)dp[ilose][j]}

但是这个转移是带环的,不能直接做。把dp[ilose][j]拆成dp[ilose][i]+dp[i][j]然后移项整理就可以了。

#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]);}
原创粉丝点击