luogu_P1850 换教室

期望概率,式子毒瘤

要弗洛伊德初始化,有重边(最后才看到,调了好久

#include<iostream>
#include<cstdio>

#define ri register int
#define u int

namespace opt {

    inline u in() {
        u x(0),f(1);
        char s(getchar());
        while(s<'0'||s>'9') {
            if(s=='-') f=-1;
            s=getchar();
        }
        while(s>='0'&&s<='9') {
            x=(x<<1)+(x<<3)+s-'0';
            s=getchar();
        }
        return x*f;
    }

}

using opt::in;

#define NN 90005

#include<cstring>

namespace mainstay {

    u N,M,V,E,c[2005],d[2005],a[305][305];

    double p[2005],f[2][90005][2];

    inline void solve() {
        scanf("%d%d%d%d",&N,&M,&V,&E);
        for(ri i(1); i<=N; ++i) scanf("%d",&c[i]);
        for(ri i(1); i<=N; ++i) scanf("%d",&d[i]);
        for(ri i(1); i<=N; ++i) scanf("%lf",&p[i]);
        std::memset(a,0x3f,sizeof(a));
        for(ri i(1); i<=E; ++i) {
            u _a,_b,_c;
            scanf("%d%d%d",&_a,&_b,&_c);
            a[_a][_b]=a[_b][_a]=std::min(a[_a][_b],_c);
        }
        for(ri i(1); i<=V; ++i) a[i][i]=0;
        for(ri t(1); t<=V; ++t) {
            for(ri i(1); i<=V; ++i) {
                for(ri j(1); j<=V; ++j) {
                    a[i][j]=std::min(a[i][t]+a[t][j],a[i][j]);
                }
            }
        }
        for(ri i(0); i<=M; ++i) f[0][i][0]=f[0][i][1]=f[1][i][0]=f[1][i][1]=9999999999999.99;
        f[1][1][1]=f[1][0][0]=0;
        for(ri i(2); i<=N; ++i) {
            u now(i&1),pre(i&1^1);
            for(ri j(0); j<=M&&j<=i; ++j) {
                f[now][j][0]=std::min(f[pre][j][1]+p[i-1]*a[d[i-1]][c[i]]+(1-p[i-1])*a[c[i-1]][c[i]],f[pre][j][0]+a[c[i-1]][c[i]]);
                if(j-1>=0) f[now][j][1]=std::min(f[pre][j-1][1]+p[i]*p[i-1]*a[d[i-1]][d[i]]+p[i]*(1-p[i-1])*a[c[i-1]][d[i]]+(1-p[i])*p[i-1]*a[d[i-1]][c[i]]+(1-p[i])*(1-p[i-1])*a[c[i-1]][c[i]],f[pre][j-1][0]+p[i]*a[c[i-1]][d[i]]+(1-p[i])*a[c[i-1]][c[i]]);
            }
        }
        double ans(999999999999.99);
        for(ri i(0); i<=M; ++i) ans=std::min(ans,std::min(f[N&1][i][0],f[N&1][i][1]));
        printf("%.2f",ans);
    }

}

int main() {

    //freopen("x.txt","r",stdin);
    //freopen("my.txt","w",stdout);
    mainstay::solve();

}

 

posted @ 2019-11-13 15:02  pai_hoo  阅读(97)  评论(0编辑  收藏  举报