其实说是概率dp,本质上和dp没什么区别,就是把所有可能转移的情况全枚举一下就行了,不过dp方程确实有点长。。。

ps:这个题的floyed我竟然之前写跪了。。。

题目:

题目描述

对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。

在可以选择的课程中,有 2n2n2n 节课程安排在 nnn 个时间段上。在第 iii(≤i≤n1 \leq i \leq n1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 cic_ici​ 上课,而另一节课程在教室 did_idi​ 进行。

在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 nnn 节安排好的课程。如果学生想更换第 iii 节课程的教室,则需要提出申请。若申请通过,学生就可以在第 iii 个时间段去教室 did_idi​ 上课,否则仍然在教室 cic_ici​ 上课。

由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛发现申请更换第 iii 节课程的教室时,申请被通过的概率是一个已知的实数 kik_iki​,并且对于不同课程的申请,被通过的概率是互相独立的。

学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多 mmm 节课程进行申请。这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申请;牛牛可以申请自己最希望更换教室的 mmm 门课程,也可以不用完这 mmm 个申请的机会,甚至可以一门课程都不申请。

因为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。

牛牛所在的大学有 vvv 个教室,有 eee 条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,通过不同的道路耗费的体力可能会有所不同。 当第 iii(≤i≤n− \leq i \leq n-≤i≤n−)节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。

现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。
输入输出格式
输入格式: 第一行四个整数 n,m,v,en,m,v,en,m,v,e。nnn 表示这个学期内的时间段的数量;mmm 表示牛牛最多可以申请更换多少节课程的教室;vvv 表示牛牛学校里教室的数量;eee表示牛牛的学校里道路的数量。 第二行 nnn 个正整数,第 iii(≤i≤n1 \leq i \leq n1≤i≤n)个正整数表示 cic_ici​,即第 iii 个时间段牛牛被安排上课的教室;保证 ≤ci≤v1 \le c_i \le v1≤ci​≤v。 第三行 nnn 个正整数,第 iii(≤i≤n1 \leq i \leq n1≤i≤n)个正整数表示 did_idi​,即第 iii 个时间段另一间上同样课程的教室;保证 ≤di≤v1 \le d_i \le v1≤di​≤v。 第四行 nnn 个实数,第 iii(≤i≤n1 \leq i \leq n1≤i≤n)个实数表示 kik_iki​,即牛牛申请在第 iii 个时间段更换教室获得通过的概率。保证 ≤ki≤ \le k_i \le ≤ki​≤。 接下来 eee 行,每行三个正整数 aj,bj,wja_j, b_j, w_jaj​,bj​,wj​,表示有一条双向道路连接教室 aj,bja_j, b_jaj​,bj​,通过这条道路需要耗费的体力值是 wjw_jwj​;保证 ≤aj,bj≤v1 \le a_j, b_j \le v1≤aj​,bj​≤v, ≤wj≤ \le w_j \le ≤wj​≤。 保证 ≤n≤ \leq n \leq ≤n≤,≤m≤ \leq m \leq ≤m≤,≤v≤ \leq v \leq ≤v≤,≤e≤ \leq e \leq ≤e≤。 保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。 保证输入的实数最多包含 位小数。 输出格式: 输出一行,包含一个实数,四舍五入精确到小数点后恰好222位,表示答案。你的输出必须和标准输出完全一样才算正确。 测试数据保证四舍五入后的答案和准确答案的差的绝对值不大于 ×− \times ^{-}×−。 (如果你不知道什么是浮点误差,这段话可以理解为:对于大多数的算法,你可以正常地使用浮点数类型而不用对它进行特殊的处理) 输入输出样例
输入样例#: 复制 0.8 0.2 0.5 输出样例#: 复制 2.80 说明 【样例1说明】 所有可行的申请方案和期望收益如下表: 【提示】 道路中可能会有多条双向道路连接相同的两间教室。 也有可能有道路两端连接的是同一间教室。 请注意区分n,m,v,e的意义, n不是教室的数量, m不是道路的数量。 特殊性质1:图上任意两点 aia_iai​, bib_ibi​, aia_iai​≠ bib_ibi​间,存在一条耗费体力最少的路径只包含一条道路。 特殊性质2:对于所有的 ≤i≤n1≤ i≤ n1≤i≤n, ki=1k_i= 1ki​= 。

题目-

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = 1e9 + ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
const int N = ;
int n,m,v,e;
int c[N],d[N];
db k[N];
db mp[N][N];
db dp[N][N][];
int main()
{
read(n);read(m);read(v);read(e);
duke(i,,n)
{
read(c[i]);
}
duke(i,,n)
{
read(d[i]);
}
duke(i,,n)
{
scanf("%lf",&k[i]);
}
duke(i,,v)
{
duke(j,,v)
{
mp[i][j] = INF;
}
}
duke(i,,e)
{
int x,y;
db w;
read(x);read(y);scanf("%lf",&w);
if(w < mp[x][y])
{
mp[x][y] = w;
mp[y][x] = w;
}
}
duke(i,,n)
{
duke(j,,m)
dp[i][j][] = dp[i][j][] = INF / ;
}
duke(i,,v)
{
mp[i][i] = mp[i][] = mp[][i] = ;
}
duke(l,,v)
{
duke(i,,v)
{
duke(j,,v)
{
// if(i != j && j != l && i != l)
{
mp[i][j] = min(mp[i][j],mp[i][l] + mp[l][j]);
}
}
}
}
dp[][][] = ,dp[][][] = ;
for(int i = ;i <= n;i++)
{
dp[i][][] = dp[i - ][][] + mp[c[i - ]][c[i]];
for(int j = ;j <= min(i,m);j++)
{
dp[i][j][] = min(dp[i][j][],min(dp[i - ][j][] + mp[c[i - ]][c[i]],dp[i - ][j][] + mp[c[i - ]][c[i]] * ( - k[i - ]) + mp[d[i - ]][c[i]] * k[i - ]));
dp[i][j][] = min(dp[i][j][],min(dp[i - ][j - ][] + mp[c[i - ]][c[i]] * ( - k[i]) + mp[c[i - ]][d[i]] * k[i],dp[i - ][j - ][] + mp[d[i - ]][d[i]] * k[i] * k[i - ] + mp[d[i - ]][c[i]] * ( - k[i]) * k[i - ] + mp[c[i - ]][d[i]] * ( - k[i - ]) * k[i] + mp[c[i - ]][c[i]] * ( - k[i]) * ( - k[i - ])));
}
}
db ans = INF / ;
duke(i,,m)
{
ans = min(ans,min(dp[n][i][],dp[n][i][]));
}
printf("%.2lf\n",ans);
return ;
}

P1850 换教室 概率dp的更多相关文章

  1. Luogu P1850 换教室(期望dp)

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

  2. P1850 换教室 期望dp

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

  3. P1850 换教室——期望DP

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

  4. luogu 1850 换教室 概率+dp

    非常好的dp,继续加油练习dp啊 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) ...

  5. bzoj4720 / P1850 换教室(Floyd+期望dp)

    P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...

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

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

  7. P1850 换教室

    P1850 换教室 现在有一张图, 有 \(v <= 300\) 个节点 你需要从 \(c_{1}\) 到 \(c_{2}\) 到 \(c_{n} (n <= 2000)\) 现在你有 \ ...

  8. Bzoj 4720 换教室 (期望DP)

    刚发现Bzoj有Noip的题目,只会换教室这道题..... Bzoj 题面:Bzoj 4720 Luogu题目:P1850 换教室 大概是期望DPNoip极其友好的一道题目,DP不怎么会的我想到了,大 ...

  9. 洛谷——P1850 换教室

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

随机推荐

  1. 如何成为一名出色的Oracle数据库管理员

    主要针对Oracle DBA在成长阶段的定位,学习方法等几大方面进行了经典的论述,详细内容请参考下文. 一.定位 Oracle分两大块,一块是开发,一块是管理.开发主要是写写存储过程.触发器什么的,还 ...

  2. strut2 拦截器 使用

    拦截器是strut2里一个很振奋人心的应用.通过配置拦截器可以在action执行之前进行一些初始化或者是其他的操作,但是在action执行之后,返回结果就已经确定,结果是很难改变了(目前我还不知道怎么 ...

  3. 您厉害您赚得多:聪明投资者的聊天记录,雪球CEO的21条投资理念

    3星|<您厉害您赚得多>:雪球创始人的投资理念.原则.技巧,及其在雪球上跟一些用户的互动的内容 作者是雪球创始人.CEO,全书基本是作者的一些投资理念+作者在雪球上跟用户的互动的内容,还有 ...

  4. 注释及Scriptlet

    1.显式注释 <!--xxxxxx-->,在正常页面上也看不出来,右键鼠标查看源代码可以看到 2.隐式注释 //xxxxx /*xxxxxx*/ <%--xxxxxxx--> ...

  5. Redis 之sentinel运维监控

    有三台redis服务器6379.6380.6381,配置6379为主服务器,6380与6381都为6379的从服务器.如果主服务器6379挂掉了,我们怎么办? 方式一:手动修改从服务器的配置,将638 ...

  6. Django - orm外键操作

    1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...

  7. Luogu P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    P2866 [USACO06NOV]糟糕的一天Bad Hair Day 题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a ...

  8. 30.IK中文分词器的安装和简单使用

    在之前我们学的都是英文,用的也是英文的standard分词器.从这一节开始,学习中文分词器.中国人基本上都是中文应用,很少是英文的,而standard分词器是没有办法对中文进行合理分词的,只是将每个中 ...

  9. java web 基本属性

    page指令 属性 描述 默认值 language 指定JSP页面使用的脚本语言 java import contenType include指令 taglib注释 <!--我是html注释-- ...

  10. python第十二周:MySql

    MySql数据库 MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司.MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不 ...