洛谷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)\) 现在你有 \ ...
随机推荐
- dp,状压dp等 一些总结
也就作业几题而已,分析一下提醒 最重要的就是,记住,没用的状态无论怎么转移最后都会是没用的状态,所以每次转移以后的有值的状态都是有用的状态. 几种思考方向: 第一种:枚举当前的状态,转移成另外一个状态 ...
- 数学:GCD
求最大公约数利用辗转相除法: long long gcd(long long a,long long b) { ) return a; else return gcd(b,a%b); } 求最小公倍数 ...
- JNLP Slave connection error解决办法
Replace in jnlp-file <argument>-workDir</argument> <argument /> with <argume ...
- UIPageControl---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...
- 【网络爬虫入门01】应用Requests和BeautifulSoup联手打造的第一条网络爬虫
[网络爬虫入门01]应用Requests和BeautifulSoup联手打造的第一条网络爬虫 广东职业技术学院 欧浩源 2017-10-14 1.引言 在数据量爆发式增长的大数据时代,网络与用户的沟 ...
- 空间数据库系列一:geomesa&sparksql 分析环境搭建
geomesa sparksql 分析环境搭建 1.安装hbase-1.3.2.1 standlone版本,作为geomesa的store a.修改配置文件:hbase-1.3.2.1/conf/hb ...
- 大话Spring Cloud
研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...
- spring-retry 重试机制
业务场景 应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果:第二步拿 ...
- 2017-2018-1 20179205《Linux内核原理与设计》第十周作业
<Linux内核原理与设计>第十周作业 教材17.19.20章学习及收获 1.在Linux以及所有unix系统中,设备被分为以下三种:块设备(blkdev)以块为单位寻址,通过块设备节点来 ...
- 【swupdate文档 一】嵌入式系统的软件管理
嵌入式系统的软件管理 嵌入式系统变得越来越复杂, 它们的软件也反映了这种复杂性的增加. 为了支持新的特性和修复,很有必要让嵌入式系统上的软件 能够以绝对可靠的方式更新. 在基于linux的系统上,我们 ...