zoukankan      html  css  js  c++  java
  • [Luogu 1850] noip16 换教室

    [Luogu 1850] noip16 换教室

    好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题

    虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造化如何。

    总之自己这段时间多做好事,多积攒RP,每天RP++

    Description

    这里写图片描述

    Solution:

    首先当你看完这个到题的时候,你应该想到先用floyd跑出任意两点的最短路,这个不解释

    然后又是这种求期望值最小,很明显也会想到DP的做法

    那么DP的方程?通过发现对于当前第i个课程教室的期望是跟前一个课程的选择与否有关的,

    那么最后我们的状态可以表示为 f[n][m][0..1]

    接下去就比较容易了,只是需要耐心仔细的分类讨论

    1、当前的课不换的情况:

    (1)上一节课也没换;

    (2)上一节课换了----成功 or 不成功;

    2、当前的课换的情况:

    (1)当前课成功换了:

    a、上一节课换了----上一节课成功 or 不成功

    b、上一节课没换;

    (2)当前的课换了失败:

    a、上一节课换了----上一节课成功 or 不成功

    b、上一节课没换;

    最后总结一下就是

    那么就完成了

    注意:转移时候因为多次出现距离可预先用cc,cd,dc,dd来表示 c[i-1] 到 c[i] 等等的距离

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<algorithm>
     6 using namespace std;
     7 const int N=500,M=2010;
     8 int c[M],d[M],dis[N][N],x,y,z,n,m,v,e;
     9 double f[M][M][2],k[M]; 
    10 int main(){
    11     scanf("%d%d%d%d",&n,&m,&v,&e);
    12     for (int i=1;i<=n;++i) scanf("%d",&c[i]);
    13     for (int i=1;i<=n;++i) scanf("%d",&d[i]);
    14     for (int i=1;i<=n;++i) scanf("%lf",&k[i]);
    15     for (int i=1;i<=v;++i) for (int j=1;j<=v;++j) dis[i][j]=1e9;
    16     for (int i=1;i<=e;++i) 
    17         scanf("%d%d%d",&x,&y,&z),dis[x][y]=dis[y][x]=min(dis[x][y],z);
    18     for (int i=1;i<=v;++i) dis[i][i]=0;
    19     for (int kkk=1;kkk<=v;++kkk)
    20         for (int i=1;i<=v;++i) if (i!=kkk)
    21             for (int j=1;j<=v;++j)
    22                 if (i!=j&&j!=kkk) dis[i][j]=min(dis[i][kkk]+dis[kkk][j],dis[i][j]);
    23     for (int i=1;i<=n;++i) for (int j=0;j<=m;++j) f[i][j][0]=f[i][j][1]=1e9;
    24     f[1][0][0]=f[1][1][1]=0.00; f[1][1][0]=0.00;
    25     for (int i=2;i<=n;++i){
    26         int cc=dis[c[i-1]][c[i]],cd=dis[c[i-1]][d[i]],dc=dis[d[i-1]][c[i]],dd=dis[d[i-1]][d[i]];
    27         f[i][0][0]=f[i-1][0][0]+cc; 
    28         for (int j=1;j<=min(i,m);++j){
    29             f[i][j][0]=min(f[i-1][j][0]+cc,f[i-1][j][1]+cc*(1-k[i-1])+dc*k[i-1]);
    30             
    31             f[i][j][1]=min(f[i-1][j-1][0]+cd*k[i]+cc*(1-k[i]),
    32                            f[i-1][j-1][1]+cc*(1-k[i-1])*(1-k[i])+cd*(1-k[i-1])*k[i]+
    33                            dc*k[i-1]*(1-k[i])+dd*k[i-1]*k[i]);
    34         }
    35     }
    36     double ans=1e9;
    37     for (int i=0;i<=m;++i)
    38         ans=min(ans,min(f[n][i][0],f[n][i][1]));
    39     printf("%.2lf",ans);
    40 }
    View Code

     

  • 相关阅读:
    罗素语录
    《一步一步写嵌入式操作系统》读书笔记1—Skyeye介绍、安装和HelloWorld
    在Raspberry Pi上安装XBMC
    Raspberry Pi上手
    axios案例
    php+mysql修改数据库数据
    将前台输入的“意见反馈”提交到后台数据库
    用JavaScript动态生成HTML(PHP+MYSQL)(2)
    用JavaScript动态生成HTML(PHP+MYSQL)(1)
    SQL课堂笔记--设计数据库
  • 原文地址:https://www.cnblogs.com/logic-yzf/p/7731988.html
Copyright © 2011-2022 走看看