zoukankan      html  css  js  c++  java
  • 【NOIP2016】换教室(动态规划)

    题目戳我

    题解

    其实感觉16年的难度不是很大????
    这道题去年考场上DP都想出来了。。。
    只是因为不会数学期望。。。然后GG。。。。
    这道题目只要把数学期望搞出来就可以啦
    设f[i][j][0/1]表示前i门课程中,已经换了j门,上一个课程是否换了教室
    然后转一下期望就可以啦。。。。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<vector>
    using namespace std;
    #define MAX 2010
    #define INF 1000000000
    int c[MAX],d[MAX];
    double K[MAX];
    int g[350][350];
    double f[MAX][MAX][2];
    double s[MAX][MAX][2];
    int n,m,v,E;
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&v,&E);
        for(int i=1;i<=n;++i)scanf("%d",&c[i]);
        for(int i=1;i<=n;++i)scanf("%d",&d[i]);
        for(int i=1;i<=n;++i)scanf("%lf",&K[i]);
        for(int i=1;i<=v;++i)
            for(int j=1;j<=v;++j)
                if(i!=j)g[i][j]=INF;
        for(int i=1;i<=E;++i)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            g[u][v]=g[v][u]=min(g[u][v],w);
        }
        for(int k=1;k<=v;++k)
            for(int i=1;i<=v;++i)
                for(int j=1;j<=v;++j)
                    g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
        //f[i][j][0/1]表示前i个课程中,申请j个,当前是否申请的期望
        for(int i=1;i<=n;++i)
            for(int j=0;j<=m;++j)
                f[i][j][0]=f[i][j][1]=INF;
        f[1][0][0]=f[1][1][1]=0.0;
        for(int i=2;i<=n;++i)
        {
            f[i][0][0]=f[i-1][0][0]+g[c[i-1]][c[i]]*1.0;
            for(int j=1;j<=m;++j)
            {
                f[i][j][0]=f[i-1][j][0]+1.0*g[c[i-1]][c[i]];
                f[i][j][0]=min(f[i][j][0],f[i-1][j][1]+1.0*K[i-1]*g[d[i-1]][c[i]]+1.0*(1.0-K[i-1])*g[c[i-1]][c[i]]);
                double t2;
                f[i][j][1]=f[i-1][j-1][0]+1.0*K[i]*g[c[i-1]][d[i]]+1.0*(1.0-K[i])*g[c[i-1]][c[i]];
                t2=f[i-1][j-1][1];
                t2+=K[i]*(1.0*K[i-1]*g[d[i-1]][d[i]]+1.0*(1.0-K[i-1])*g[c[i-1]][d[i]]);
                t2+=(1.0-K[i])*(1.0*K[i-1]*g[d[i-1]][c[i]]+1.0*(1.0-K[i-1])*g[c[i-1]][c[i]]);            
                f[i][j][1]=min(f[i][j][1],t2);
            }
        }
        double ans=f[n][0][0];
        for(int i=1;i<=m;++i)ans=min(f[n][i][0],ans),ans=min(f[n][i][1],ans);
        printf("%.2lf
    ",ans);
        return 0;    
    }
    
  • 相关阅读:
    SpringBoot返回json和xml
    Spring boot 集成MQ
    Spring boot freemarker 配置
    Spring boot 自定义注解标签记录系统访问日志
    RIDE对应驱动下载
    在线修改pdf识别图片
    记公司食堂收厨余垃圾的人
    [Ruby]使用Ruby抓取网页及加工处理
    [转载]SCSS 和 SASS 和 HAML 和CoffeeScript
    [ACM]反复平方法的两种写法
  • 原文地址:https://www.cnblogs.com/cjyyb/p/7622128.html
Copyright © 2011-2022 走看看