洛谷P1850换教室
理解题意:给定你一个学期的课程和教室数量以及教室之间的距离还有换教室成功的概率,求一个学期走的距离的期望最小值
题目是有够恶心的,属于那种一看就让人不想刷的题目。。。很明显的动规,但是那个动规方程真的是感人肺腑。。。绝对是我见过的最长的动规转移方程。。
状态还是非常好理解的,dp[ i ][ j ][ k ]表示到第 i 个时间段换了 j 次教室,第 j 次成功与否的最小期望路径,当然这里还需要用最短路优化(不用看,这么小的数据范围肯定是floyd),还是看代码吧,没什么好讲的,把那个长得感人肺腑的动规方程理解的就好做了:
#include<bits/stdc++.h>
#define maxx 305
#define maxn 2012
using namespace std;
int n,m,v,e,c1[maxn],c2[maxn];
double dp[maxn][maxn][],ans;
double f[maxx][maxx],p[maxn];
int main()
{
cin>>n>>m>>v>>e;ans=0x3f3f3f3f;
for(int i=;i<=n;i++)scanf("%d",&c1[i]);
for(int i=;i<=n;i++)scanf("%d",&c2[i]);
for(int i=;i<=n;i++)scanf("%lf",&p[i]);
for(int i=;i<=v;i++)
for(int j=;j<i;j++)
{
f[i][j]=0x3f3f3f3f;
f[j][i]=0x3f3f3f3f;
}
for(int i=;i<=e;i++){
int x,y;double w;
scanf("%d%d%lf",&x,&y,&w);
f[x][y]=min(f[x][y],w);
f[y][x]=f[x][y];}//别忘了判重边
for(int k=;k<=v;k++)
for(int i=;i<=v;i++)
for(int j=;j<i;j++)
if(f[i][j]>f[i][k]+f[k][j]){
f[i][j]=f[i][k]+f[k][j];
f[j][i]=f[i][j];}//floyd,不解释
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=;k++)
dp[i][j][k]=0x3f3f3f3f;
dp[][][]=0.0;dp[][][]=0.0;
for(int i=;i<=n;i++){
for(int j=;j<=i&&j<=m;j++){
dp[i][j][]=min(dp[i-][j][]+f[c1[i-]][c1[i]],//状态:上一次不换,这一次不换
dp[i-][j][]+f[c2[i-]][c1[i]]*p[i-] //上一次换成功
+f[c1[i-]][c1[i]]*(1.0-p[i-])); //上一次失败
if(j>=)
dp[i][j][]=min(dp[i-][j-][]+f[c1[i-]][c2[i]]*p[i] //上一次不换,这一次换成功
+f[c1[i-]][c1[i]]*(1.0-p[i]), //这一次失败
dp[i-][j-][]+f[c2[i-]][c2[i]]*p[i-]*p[i] //上一次换,两次都成功
+f[c1[i-]][c2[i]]*(1.0-p[i-])*p[i] //上一次失败,这一次成功
+f[c2[i-]][c1[i]]*p[i-]*(1.0-p[i]) //上一次成功,这一次失败
+f[c1[i-]][c1[i]]*(1.0-p[i-])*(1.0-p[i])); //两次都失败
}
}
//是不是长得感人肺腑???
for(int i=;i<=m;i++)
for(int j=;j<=;j++)
ans=min(ans,dp[n][i][j]);
//找到最小期望路径
printf("%.2lf",ans);
return ;
}
怎么样,是不是感人肺腑??QWQ
洛谷P1850换教室的更多相关文章
- 洛谷 P1850 换教室 解题报告
P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1≤i≤n) ...
- 洛谷——P1850 换教室
P1850 换教室 有 2n 节课程安排在 nn 个时间段上.在第 i个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 $c_i$ 上课,而另一节课程在教室 $d_i$ ...
- 洛谷 P1850 换教室
P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq ...
- 洛谷P1850 换教室
令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...
- 洛谷P1850 换教室(概率dp)
传送门 我的floyd竟然写错了?今年NOIP怕不是要爆零了? 这就是一个概率dp 我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移 ...
- 洛谷P1850 换教室 [noip2016] 期望dp
正解:期望dp 解题报告: 哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星! 好那先把这题理顺了嗷qwq 首先我们看到期望就会 ...
- 洛谷P1850 换教室_数学期望_Floyd
调了一下午QAQ-让我对数学期望的理解又提升了一个层次. 首先,我们发现 v<=300v<=300v<=300 , 这样我们就可以用 FloydFloydFloyd 算法来 O(n3 ...
- bzoj4720 / P1850 换教室(Floyd+期望dp)
P1850 换教室 先用Floyd把最短路处理一遍,接下来就是重头戏了 用 f [ i ][ j ][ 0/1 ] 表示在第 i 个时间段,发出了 j 次申请(注意不一定成功),并且在这个时间段是否( ...
- P1850 换教室
P1850 换教室 现在有一张图, 有 \(v <= 300\) 个节点 你需要从 \(c_{1}\) 到 \(c_{2}\) 到 \(c_{n} (n <= 2000)\) 现在你有 \ ...
随机推荐
- Android 之 Spinner 键值对的绑定(转)
很多时候我们会在下拉菜单中绑定一个值,但是 Spinner本身不提供这样的服务 于是在网上找了N久,终于找到一个简单易用的方案;废话不多说,直接上菜了 首先要定义一个Item类,有以下要注意的: ...
- 超详细的Java面试题总结(三)之Java集合篇常见问题
List,Set,Map三者的区别及总结 List:对付顺序的好帮手 List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set:注重独一无二的性质 不允许重复的集合.不会有多个元 ...
- 【HNOI】 小A的树 tree-dp
[题目描述]给定一颗树,每个点有各自的权值,任意选取两个点,要求算出这两个点路径上所有点的and,or,xor的期望值. [数据范围]n<=10^5 首先期望可以转化为求树上所有点对的and,o ...
- elk + suricata 实验环境详细安装教程
1.安装运行suricata,需要*** sudo add-apt-repository ppa:oisf/suricata-stable sudo apt-get update sudo apt-g ...
- Opencv模块功能介绍
本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 站在巨 ...
- 【swupdate文档 一】嵌入式系统的软件管理
嵌入式系统的软件管理 嵌入式系统变得越来越复杂, 它们的软件也反映了这种复杂性的增加. 为了支持新的特性和修复,很有必要让嵌入式系统上的软件 能够以绝对可靠的方式更新. 在基于linux的系统上,我们 ...
- sicily 1001. Fibonacci 2
1001. Fibonacci 2 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn-1 + F ...
- 2017多校第8场 HDU 6143 Killer Names 容斥,组合计数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意:m种颜色需要为两段长度为n的格子染色,且这两段之间不能出现相同的颜色,问总共有多少种情况. ...
- MongoDB的win安装教程
写在前面的 Mongo DB 是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐.Mongo DB很好的实现了面向对象的思想(OO思想),在Mo ...
- leetcode 之Valid Palindrome(26)
现在开始进入字符串系列. 判断回文串的.首尾各定义一个指针,然后相比较.难点在于如何提出非字母数字的字符. bool isValidPalind(string s) { //转为小写,注意这个函数的用 ...