洛谷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)\) 现在你有 \ ...
随机推荐
- 洛谷2115 [USACO14MAR]破坏Sabotage
https://www.luogu.org/problem/show?pid=2115 题目描述 Farmer John's arch-nemesis, Farmer Paul, has decide ...
- mvc Dapper_Report_Down_ExcelFile
一.基于Aspose.Cells.Dapper导出Excel Dapper的Query返回要不是对象的IEnumerable,要不是Dynamic的IEnumerable,都不适合不用反射就能够动态获 ...
- 【Foreign】光 [莫比乌斯反演]
光 Time Limit: 10 Sec Memory Limit: 128 MB Description 天猫有一个长方形盒子,长宽分别为A,B. 这个长方形盒子的内壁全部是镜面. 天猫在这个盒子 ...
- NGINX: Primary script unknown
参考: [ StackExchange ] 这里的解决方式应该是你排查了所有原因依然无法解决问题. SELINUX 更改 selinux 配置 chcon -R -t httpd_sys_conten ...
- (转)matlab练习程序(HOG方向梯度直方图)
matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...
- Drainage Ditches(POJ1273+网络流+Dinic+EK)
题目链接:poj.org/problem?id=1273 题目: 题意:求最大流. 思路:测板子题,分别用Dinic和EK实现(我的板子跑得时间均为0ms). Dinic代码实现如下: #includ ...
- Connections between cities(LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题目: Problem Description After World War X, a lot ...
- bzoj 1046 LIS
假设我们知道以每个点开始到最后的最长上升序列,设为w[i],这样首先我们在w值中取max,如果询问的值比max大,这样显然就是无解,如果小的话,我们需要求出来字典序最小的方案. 那么对于所有i,我们肯 ...
- bzoj 2730 割点
首先我们知道,对于这张图,我们可以枚举坍塌的是哪个点,对于每个坍塌的点,最多可以将图分成若干个不连通的块,这样每个块我们可能需要一个出口才能满足题目的要求,枚举每个坍塌的点显然是没有意义的,我们只需要 ...
- setTimeout()和setInterval()方法的区别
setTimeout(); //5秒后执行yourFunction(),只执行一次 setInterval(); //每隔5秒执行一次 1.setTimeout(funhander,time)的作用是 ...