换教室

期望DP

状态:

f[i][j][0/1]表示前i节课 提交j个申请 第i个教室不申请/申请(为了确定当前教室,方便转移) 的最小期望

方程:

f[i][j][0]=min(f[i-1][j][0]+dis[cla[i-1]][cla[i]],f[i-1][j][1]+dis[ano[i-1]][cla[i]]*k[i-1]+dis[cla[i-1]][cla[i]]*(1-k[i-1]));
f[i][j][1]=min(f[i-1][j-1][0]+dis[cla[i-1]][ano[i]]*k[i]+dis[cla[i-1]][cla[i]]*(1-k[i]),f[i-1][j-1][1]+(dis[ano[i-1]][ano[i]]*k[i]+dis[ano[i-1]][cla[i]]*(1-k[i]))*k[i-1]+(dis[cla[i-1]][ano[i]]*k[i]+dis[cla[i-1]][cla[i]]*(1-k[i]))*(1-k[i-1]));

边界:

f[1][0][0]=f[1][1][1]=0;

代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXN 2010
#define MAXV 310
#define re register
int n,m,v,e,cla[MAXN],ano[MAXN],dis[MAXV][MAXV];
inline double min(double x,double y) { return x<y?x:y; }
double k[MAXN],f[MAXN][MAXN][],ans=1e30;
int main()
{
scanf("%d%d%d%d",&n,&m,&v,&e);
for(re int i=;i<=n;i++)
scanf("%d",&cla[i]);
for(re int i=;i<=n;i++)
scanf("%d",&ano[i]);
for(re int i=;i<=n;i++)
scanf("%lf",&k[i]);
memset(dis,,sizeof(dis));
int x,y,w;
for(int i=;i<=v;i++)
dis[i][i]=;
for(int i=;i<=e;i++)
{
scanf("%d%d%d",&x,&y,&w);
if(dis[x][y]>w) dis[x][y]=dis[y][x]=w;
}
for(int kk=;kk<=v;kk++)
for(int i=;i<=v;i++)
for(int j=;j<=v;j++)
if(dis[i][j]>dis[i][kk]+dis[kk][j])
dis[i][j]=dis[i][kk]+dis[kk][j];
memset(f,,sizeof(f));
f[][][]=f[][][]=;
for(int i=;i<=n;i++)
for(int j=,d=i<m?i:m;j<=d;j++){
f[i][j][]=min(f[i-][j][]+dis[cla[i-]][cla[i]],f[i-][j][]+dis[ano[i-]][cla[i]]*k[i-]+dis[cla[i-]][cla[i]]*(-k[i-]));
if(j) f[i][j][]=min(f[i-][j-][]+dis[cla[i-]][ano[i]]*k[i]+dis[cla[i-]][cla[i]]*(-k[i]),f[i-][j-][]+(dis[ano[i-]][ano[i]]*k[i]+dis[ano[i-]][cla[i]]*(-k[i]))*k[i-]+(dis[cla[i-]][ano[i]]*k[i]+dis[cla[i-]][cla[i]]*(-k[i]))*(-k[i-]));
}
for(int i=;i<=m;i++)
ans=min(ans,min(f[n][i][],f[n][i][]));
printf("%.2lf\n",ans);
return ;
}

【洛谷P1850】换教室[2016NOIP提高组]的更多相关文章

  1. 洛谷 P1850 换教室 解题报告

    P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1≤i≤n) ...

  2. 洛谷——P1850 换教室

    P1850 换教室 有 2n 节课程安排在 nn 个时间段上.在第 i个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 $c_i$​ 上课,而另一节课程在教室 $d_i$ ...

  3. 洛谷 P1850 换教室

    P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq ...

  4. 洛谷P1850换教室

    题目传送门 理解题意:给定你一个学期的课程和教室数量以及教室之间的距离还有换教室成功的概率,求一个学期走的距离的期望最小值 题目是有够恶心的,属于那种一看就让人不想刷的题目...很明显的动规,但是那个 ...

  5. 洛谷P1850 换教室

    令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...

  6. 洛谷P1850 换教室(概率dp)

    传送门 我的floyd竟然写错了?今年NOIP怕不是要爆零了? 这就是一个概率dp 我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移 ...

  7. 洛谷P1850 换教室 [noip2016] 期望dp

    正解:期望dp 解题报告: 哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星! 好那先把这题理顺了嗷qwq 首先我们看到期望就会 ...

  8. 洛谷P1850 换教室_数学期望_Floyd

    调了一下午QAQ-让我对数学期望的理解又提升了一个层次. 首先,我们发现 v<=300v<=300v<=300 , 这样我们就可以用 FloydFloydFloyd 算法来 O(n3 ...

  9. 洛谷P1003 铺地毯 noip2011提高组day1T1

    洛谷P1003 铺地毯 noip2011提高组day1T1 洛谷原题 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n ...

随机推荐

  1. python从字符串内取两个符号之间的内容

    #取字符串中两个符号之间的东东 def txt_wrap_by(self,start_str, end, html): start = html.find(start_str) if start &g ...

  2. ListView与ArrayAdapter的搭配使用

    在android中,ListView是一种很重要的控件,一般的使用中,常建立一个所需类型的ArrayList,再通过ArrayAdapter把ListView绑定到ArrayList上,通过Array ...

  3. C#的params参数遇到null

    params参数支持数组作为参数传入,但并不支持List 定义一个使用params的参数 private static void UseParam(params int[] args) { if (a ...

  4. elasticsearch 2.4.0执行update的时候发现的一个问题

    请关注inline参数的变化 正确: POST /test/type1/1/_update{ "script" : { "inline": "ctx. ...

  5. pat04-树4. Root of AVL Tree (25)

    04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...

  6. http反向代理之haproxy详解

    1.反向代理定义 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...

  7. Flask 框架理解(一)

    Flask 框架理解(一) web 服务器 , web 框架 以及 WSGI 这里说的 web 服务器特指纯粹的 python HTTP 服务器(比如 Gunicorn,而不是 Apache,Ngin ...

  8. C# 使用cookie实现登录

    首先,我们需要做的是什么? 我们成功登录之后,跳转到主界面,然后主界面的登录按钮变成头像啥的.下一次打开网页就要判断有没有登录过,有cookie就不需要登录,直接显示头像 1.成功登录后,客户端请求服 ...

  9. mysql 查两个表相同的值

    比如一个数据库 表A和表B 都有一个username字段, 现查出与表A中username值相同的表B的username和password数据 select B.username,B.password ...

  10. 每隔5s执行一次动作

    TimeSpan timespan; //第一次获取系统时间 DateTime d1 = DateTime.Now; while (true) { //第二次获取系统时间 DateTime d2 = ...