洛谷P1850 换教室_数学期望_Floyd
调了一下午QAQ…让我对数学期望的理解又提升了一个层次。
首先,我们发现 v<=300v<=300v<=300 , 这样我们就可以用 FloydFloydFloyd 算法来 O(n3)O(n^3)O(n3) 处理出任意两点间的最短路。
对于题目,我们不难列出状态dp[i][j][0/1]dp[i][j][0/1]dp[i][j][0/1]。
这个状态代表:走到第iii个点,用了jjj次机会,当前使用了(0表示未使用,1表示使用)机会的最小期望值。
首先,我们考虑dp[i][j][0]dp[i][j][0]dp[i][j][0],那么上一个点可能使用了机会,也可能未使用机会。
不难列出未使用机会的方程:
dp[i][j][0]=dp[i−1][j][0]+f[ci−1][ci]dp[i][j][0]=dp[i-1][j][0]+f[c_{i-1}][c_{i}]dp[i][j][0]=dp[i−1][j][0]+f[ci−1][ci]
那么对于上一次使用了机会,方程应为:
dp[i][j][0]=dp[i−1][j][1]+f[ci−1][ci]∗(1−k[i−1])+f[di−1][ci]∗k[i−1]dp[i][j][0]=dp[i-1][j][1] + f[c_{i-1}][c_{i}] * (1 - k[i-1]) + f[
d_{i-1}][c_{i}] * k[i-1]dp[i][j][0]=dp[i−1][j][1]+f[ci−1][ci]∗(1−k[i−1])+f[di−1][ci]∗k[i−1]
体会一下,上一次使用机会的话会面临两种情况:
1.交换成功,路程为f[di−1][ci]f[d_{i-1}][c_{i}]f[di−1][ci],概率为k[i−1]k[i-1]k[i−1].
2.未交换成功,路程为f[ci−1][ci]f[c_{i-1}][c_{i}]f[ci−1][ci],概率为1−k[i−1]1-k[i-1]1−k[i−1].
再考虑一下当前使用机会,分6种情况。
1.上一轮未交换,当前交换失败:路程为f[ci−1][ci]f[c_{i-1}][c_{i}]f[ci−1][ci],概率为1−k[i]1-k[i]1−k[i]
2.上一轮未交换,当前交换成功:路程为f[ci−1][di]f[c_{i-1}][d_{i}]f[ci−1][di],概率为k[i]k[i]k[i]
3.上一轮交换失败,当前交换失败,路程为f[ci−1][ci]f[c_{i-1}][c_{i}]f[ci−1][ci],概率为(1−k[i−1])∗(1−k[i])(1-k[i-1])*(1-k[i])(1−k[i−1])∗(1−k[i])
4.上一轮交换失败,当前交换成功,路程为f[ci−1][di]f[c_{i-1}][d_{i}]f[ci−1][di],概率为(1−k[i−1])∗k[i](1-k[i-1])*k[i](1−k[i−1])∗k[i]
5.上一轮交换成功,当前交换失败,路程为f[di−1][ci]f[d_{i-1}][c_{i}]f[di−1][ci],概率为k[i−1]∗(1−k[i])k[i-1]*(1-k[i])k[i−1]∗(1−k[i])
6.上一轮交换成功,当前交换成功,路程为f[di−1][di]f[d_{i-1}][d_{i}]f[di−1][di],概率为k[i−1]∗k[i]k[i-1]*k[i]k[i−1]∗k[i]
最后将所有信息合并即可,另外细节巨多,到注意初始化。
Code:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 350;
const int N = 2000 + 5;
const double inf = 1000000000;
int f[maxn][maxn], c[N], d[N], n,m,v,e;
double k[N], dp[N][N][2];
inline void update(double &a, double b){ if(b < a) a = b;}
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) f[i][j] = f[j][i] = inf;
for(int i = 1;i <= e; ++i)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
f[a][b] = f[b][a] = min(f[a][b], c);
}
for(int i = 0;i <= v; ++i) f[i][0] = f[0][i] = f[i][i] = 0;
for(int k = 1;k <= v; ++k)
for(int i = 1;i <= v; ++i)
for(int j = 1;j <= v; ++j)
if(f[i][k] != inf && f[k][j] != inf)f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
for (int i = 0; i <= n; ++i)
for (int j = 0; j <= m; ++j)dp[i][j][0] = dp[i][j][1] = inf;
dp[1][0][0] = dp[1][1][1] = dp[0][0][0] = 0;
for(int i = 1;i <= n; ++i)
{
dp[i][0][0] = dp[i-1][0][0] + f[c[i-1]][c[i]];
for(int j = 1;j <= min(i,m); ++j)
{
update(dp[i][j][0], dp[i-1][j][0] + f[c[i-1]][c[i]]);
update(dp[i][j][0], dp[i-1][j][1] + f[c[i-1]][c[i]] * (1 - k[i-1]) + f[d[i-1]][c[i]] * k[i-1]);
if(j >= 1)
{
double tmp = 0.0;
update(dp[i][j][1], dp[i-1][j-1][0] + f[c[i-1]][d[i]] * k[i] + f[c[i-1]][c[i]] * (1 - k[i]));
tmp = dp[i-1][j-1][1];
tmp += f[c[i-1]][c[i]] * (1 - k[i-1]) * (1 - k[i]);
tmp += f[d[i-1]][c[i]] * k[i-1] * (1 - k[i]);
tmp += f[c[i-1]][d[i]] * (1 - k[i-1]) * k[i];
tmp += f[d[i-1]][d[i]] * k[i-1] * k[i];
update(dp[i][j][1], tmp);
}
}
}
double ans = inf;
for(int j = 0;j <= m; ++j)
{
update(ans, dp[n][j][0]);
update(ans, dp[n][j][1]);
}
printf("%.2f",ans);
return 0;
}
洛谷P1850 换教室_数学期望_Floyd的更多相关文章
- 洛谷——P1850 换教室
P1850 换教室 有 2n 节课程安排在 nn 个时间段上.在第 i个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 $c_i$ 上课,而另一节课程在教室 $d_i$ ...
- 洛谷 P1850 换教室
P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq ...
- 洛谷 P1850 换教室 解题报告
P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1≤i≤n) ...
- 洛谷P1850换教室
题目传送门 理解题意:给定你一个学期的课程和教室数量以及教室之间的距离还有换教室成功的概率,求一个学期走的距离的期望最小值 题目是有够恶心的,属于那种一看就让人不想刷的题目...很明显的动规,但是那个 ...
- 洛谷P1850 换教室 [noip2016] 期望dp
正解:期望dp 解题报告: 哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星! 好那先把这题理顺了嗷qwq 首先我们看到期望就会 ...
- 洛谷P1850 换教室
令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...
- 洛谷P1850 换教室(概率dp)
传送门 我的floyd竟然写错了?今年NOIP怕不是要爆零了? 这就是一个概率dp 我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移 ...
- bzoj4720 / P1850 换教室(Floyd+期望dp)
P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...
- Luogu P1850 换教室(期望dp)
P1850 换教室 题意 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1\l ...
随机推荐
- 1.sts的下载安装
sts的官方下载如下: http://spring.io/tools3/sts/all/ 将下载后的压缩文件解压,在解压后的sts-bundle下的sts-3.9.1RELEASE目录中STS.exe ...
- ps图标长投影如何做?
https://jingyan.baidu.com/article/2f9b480dad9c8e41cb6cc297.html ps图标长投影
- 5G的前景以及意义
首先来介绍一下5G:5G网络是第五代移动通信网络,其峰值理论传输速度可达每8秒1GB,比4G网络的传输速度快数百倍.举例来说,一部1G的电影可在8秒之内下载完成. 5G的技术原理是:三星电子通过研究和 ...
- Java代码模拟http请求的两种方式
z这里用百度地图的逆地理编码接口为例, 第一种方式:(通过jdk中的java.net包) 引入工具类 import java.net.URL; import java.net.URLConnectio ...
- Basic Memory Structures
Basic Memory Structures The basic memory structures associated with Oracle Database include: System ...
- [bzoj2259][Oibh]新型计算机_Dijkstra
新型计算机 bzoj-2259 Oibh 题目大意:给定一个n个数的数列,第i个数为a[i],更改第i个数至x的代价为|x-a[i]|.求最小代价,使得:读入一个数s1后,向后连着读s1个数,然后如s ...
- HDU 2295
二分答案+重复覆盖.注意返回的条件哦,不能光套模板. #include <iostream> #include <cstdio> #include <cstring> ...
- HDU 4273
计算凸包重心到各面的最短距离. 若知道重心,按四面体用体积法即可求出高. 关键在于,多面体重心的求法.这必须把多面体分割成多个四面体来求.下面从多边形的重心说起. 一般来用,对于一个多边形(p0,p1 ...
- 怎样又一次编译linux内核
linux作为自由软件.在广大爱好者的支持下,内核版本号不断更新. 新的内核修订了就得内核的bug,并添加了很多新的特性.假设用户须要使用这些新的特性或者依据自己的系统量身定做一个更高效或更稳定的内核 ...
- 远程桌面授权server没有提供许可证问题解决方法
今天远程server报如图所看到的错误,网上查找的方法 方法一:(亲測有效) mstsc /V:192.168.0.3 /admin 方法二:(因为server正在使用中,未作測试) 删除远程桌面服 ...