zoukankan      html  css  js  c++  java
  • 洛谷P1850 [noip2016]换教室——期望DP

    题目:https://www.luogu.org/problemnew/show/P1850

    注释掉了一堆愚蠢,自己还是太嫩了...

    首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选不是随机的而是取最优的;

    然后注意 double 类型不能 memset ,还是要手动赋值;

    其实也不算很难,却调了很久...

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int const maxn=2005;
    int n,m,v,e,dis[305][305],c[maxn],d[maxn];
    double p[maxn],f[maxn][maxn][3],ans;
    int rd()
    {
        int ret=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
        while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();
        return ret*f;
    }
    int main()
    {
        n=rd(); m=rd(); v=rd(); e=rd();
        for(int i=1;i<=n;i++)c[i]=rd();
        for(int i=1;i<=n;i++)d[i]=rd();
        for(int i=1;i<=n;i++)scanf("%lf",&p[i]);
        memset(dis,0x3f,sizeof dis);
        for(int i=1,x,y,z;i<=e;i++)
        {
            x=rd(); y=rd(); z=rd();
            dis[x][y]=min(dis[x][y],z); dis[y][x]=dis[x][y];//
        }
        for(int i=1;i<=v;i++)dis[i][i]=0;//!!!
        for(int k=1;k<=v;k++)
            for(int i=1;i<=v;i++)
                for(int j=1;j<=v;j++)
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    //    memset(f,1,sizeof f);//!!!
    //    for(int j=0;j<=m;j++)
    //    {
    //        f[n][j][0]=0; f[n][j][1]=0;
    //    }
    //    for(int i=n-1;i;i--)
    //        for(int j=0;j<=m;j++)
    //        {
    //            f[i][j][0]=(f[i+1][j][0]+f[i+1][j][1])/2+(p[i-1]*dis[d[i]][c[i+1]]+(1-p[i-1])*dis[c[i]][c[i+1]]);
    //            if(j)f[i][j][1]=(f[i+1][j-1][0]+f[i+1][j-1][1])/2+
    //                        p[i]*(p[i-1]*dis[d[i]][d[i+1]] + (1-p[i-1])*dis[c[i]][d[i+1]])/2
    //                        +(1-p[i])*dis[c[i]][c[i+1]]/2;
    //        }
    //    printf("%lf",f[1][m][0]+f[1][m][1]);
        for(int i=1;i<=n;i++)//手动memset
            for(int j=0;j<=m;j++)
                for(int k=0;k<=1;k++)f[i][j][k]=0x3f3f3f3f;
        f[1][0][0]=0; f[1][1][1]=0;
        for(int i=2;i<=n;i++)
            for(int j=0;j<=m&&j<=i;j++)
            {
                f[i][j][0]=min(f[i-1][j][0] + dis[c[i-1]][c[i]],
                               f[i-1][j][1] + (1-p[i-1])*dis[c[i-1]][c[i]] + p[i-1]*dis[d[i-1]][c[i]]);
                if(j)
                f[i][j][1]=min(f[i-1][j-1][0] + (1-p[i])*dis[c[i-1]][c[i]] + p[i]*dis[c[i-1]][d[i]],
                               f[i-1][j-1][1] + (1-p[i-1])*(1-p[i])*dis[c[i-1]][c[i]] + p[i-1]*p[i]*dis[d[i-1]][d[i]] +
                                                   (1-p[i-1])*p[i]*dis[c[i-1]][d[i]] + p[i-1]*(1-p[i])*dis[d[i-1]][c[i]]);
            }
        ans=0x3f3f3f3f;
        for(int j=0;j<=m;j++)
            ans=min(ans,min(f[n][j][0],f[n][j][1]));
        printf("%.2lf",ans);
        return 0;
    }
  • 相关阅读:
    node.js结合wechaty实现微信机器人[基础篇]
    .env文件为NodeJS全局环境变量
    基于jquery实现一个提示插件
    Puppeteer实现一个超简单的自动化机器人
    Vue高仿阿里动态banner,制作组件
    css不常用属性
    Vue表单校验失败滚动到错误位置
    C# Func委托
    深入解析C# 4th 笔记(第一章)
    C# 笔记 XML基础
  • 原文地址:https://www.cnblogs.com/Zinn/p/9198921.html
Copyright © 2011-2022 走看看