洛谷P1850 换教室 [noip2016] 期望dp
正解:期望dp
解题报告:
哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星!
好那先把这题理顺了嗷qwq
首先我们看到期望就会想到dp是趴,加上dp也确实很NOIp那就直接往dp的方向想嘛
比较容易想到的状态就是f[i][j]表示到第i个阶段了然后已经申请了j次的最小体力,然而在思考转移方程的时候就会发现如果这么设的话好像是不会转移的嗷,因为我们之后的转移会和你上一次是去的c还是d有关,然后就考虑再加一轮[0/1]表示上次申请了没有
然后转移这儿,巨麻烦一点点扣
f[i][j][0]:到第i个阶段了申请了j次这次没申请
既然这次没申请那i-1状态肯定也是申请j次,于是可以知道是从f[i][j]转移来的,这里简单
然后有几种可能呢?
- 上次没申请,那就是f[i][j][0],此时的概率是100%(不申请百分百通不过嘛),那就是f[i][j][0]+dis[c[i-1]][c[i]]
- 上次申请了,那就是f[i][j][1],此时可能通过可能没通过,如果通过了+dis[d[i-1]][c[i]]*k[i-1],没通过+dis[c[i-1]][c[i]]*(1-k[i-1])
- 总结起来就是 min( f[i-1][j][0] + jl[c[i-1]][c[i]] , f[i-1][j][1] + (1-k[i-1])*jl[c[i-1]][c[i]] + k[i-1]*jl[d[i-1]][c[i]])
f[i][j][1]:到第i个阶段了申请了j次这次申请了
理由同上,可以知道是从f[i][j-1]转移来的
这个就会比较长了...
- 上次没申请,f[i][j-1][0],这时有俩可能,如果这次申请通过了,+dis[c[i-1]][d[i]]*k[i],没通过,+dis[c[i-1]][c[i]]*(1-k[i])
- 总结起来就是 f[i-1][j-1][0] + k[i]*jl[c[i-1]][d[i]] + (1-k[i])*jl[c[i-1]][c[i]]
- 上次申请了,f[i][j-1][1],然后有四种可能(上次/这次通过否 因此22嘛
- 如果上次通过了这次通过了,+dis[d[i-1]][d[i]]*k[i-1]*k[i],如果上次通过了这次没通过,+dis[d[i-1]][c[i]]*k[i-1]*(1-k[i]),如果上次没通过这次通过了,+dis[c[i-1]][d[i]]*(1-k[i-1])*k[i],如果上次没通过这次还是没通过,+dis[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])
- 总结起来就是f[i-1][j-1][1] + (1-k[i-1])*(1-k[i])*jl[c[i-1]][c[i]] + (1-k[i-1])*k[i]*jl[c[i-1]][d[i]] + k[i-1]*(1-k[i])*jl[d[i-1]][c[i]] + k[i-1]*k[i]*jl[d[i-1]][d[i]]
- 然后这整个儿就是 min( f[i-1][j-1][0] + k[i]*jl[c[i-1]][d[i]] + (1-k[i])*jl[c[i-1]][c[i]] , f[i-1][j-1][1] + (1-k[i-1])*(1-k[i])*jl[c[i-1]][c[i]] + (1-k[i-1])*k[i]*jl[c[i-1]][d[i]] + k[i-1]*(1-k[i])*jl[d[i-1]][c[i]] + k[i-1]*k[i]*jl[d[i-1]][d[i]] )
昂然后我觉得这个理顺了就差不多了?最后放个代码就好了qwq
#include<bits/stdc++.h>
using namespace std;
#define rp(i,x,y) for(register int i=x;i<=y;++i)
+,N=+,M=+;
;
int n,m,v,e,c[N],d[N],jl[V][V];
],ans=;
inline int read()
{
;;
'))ch=getchar();
if(ch=='-')ch=getchar();
)+(x<<)+(ch^'),ch=getchar();
return y?x:-x;
}
inline void floyd()
{
rp(k,,v)
rp(i,,v)
rp(j,,i-)jl[j][i]=jl[i][j]=min(jl[i][j],jl[k][i]+jl[j][k]);
}
inline double min3(double x,double y,double z){return min(min(x,y),z);}
int main()
{
n=read();m=read();v=read();e=read();
rp(i,,n)c[i]=read();rp(i,,n)d[i]=read();
rp(i,,n)scanf("%lf",&k[i]);
rp(i,,v)rp(j,,i-)jl[i][j]=jl[j][i]=(int)inf;
rp(i,,e){int t1=read(),t2=read(),t3=read();jl[t1][t2]=min(t3,jl[t1][t2]);jl[t2][t1]=jl[t1][t2];}
floyd();
rp(i,,n)
rp(j,,m)f[i][j][]=f[i][j][]=inf;
f[][][]=f[][][]=;
rp(i,,n)
{
rp(j,,m)
{
f[i][j][]=min( f[i-][j][] + jl[c[i-]][c[i]] , f[i-][j][] + (-k[i-])*jl[c[i-]][c[i]] + k[i-]*jl[d[i-]][c[i]]);
)
{
f[i][j][]=min( f[i-][j-][] + k[i]*jl[c[i-]][d[i]] + (-k[i])*jl[c[i-]][c[i]] , f[i-][j-][] + (-k[i-])*(-k[i])*jl[c[i-]][c[i]] + (-k[i-])*k[i]*jl[c[i-]][d[i]] + k[i-]*(-k[i])*jl[d[i-]][c[i]] + k[i-]*k[i]*jl[d[i-]][d[i]] );
}
}
}
rp(i,,m)ans=min3(ans,f[n][i][],f[n][i][]);
printf("%.2lf",ans);
}
//哦还有个细节,就,这个题目的初值赋值的时候要注意一下...我开始开小了然后只88,后来开大了点儿又爆了范围直接变成负数...ummm...真实烦skr人QAQ然后还交了两次才过的...
洛谷P1850 换教室 [noip2016] 期望dp的更多相关文章
- 洛谷P1850 换教室(概率dp)
传送门 我的floyd竟然写错了?今年NOIP怕不是要爆零了? 这就是一个概率dp 我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移 ...
- 洛谷——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 换教室_数学期望_Floyd
调了一下午QAQ-让我对数学期望的理解又提升了一个层次. 首先,我们发现 v<=300v<=300v<=300 , 这样我们就可以用 FloydFloydFloyd 算法来 O(n3 ...
- Luogu P1850换教室【期望dp】By cellur925
题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...
- 洛谷P1850 换教室
令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...
- 【Luogu】P1850换教室(期望DP)
题目链接 又一道面向题解编程的恶心神题.真是叫人质壁分离…… 设f[i][j][k]表示考虑了前i节课,尝试了j次,当前申请结果为k时消耗的体力值. 对于f[i][j][0]有两种情况:一是我们的主角 ...
随机推荐
- Linux 日常运维
查看用户信息:w 查看系统负载:uptime 查看系统资源使用情况:vmstat 查看进程动态:top 查看网卡流量:sar 查看网卡流量:nload 查看磁盘读写:iostat 查看磁盘读写:iot ...
- Onpaint和OnDraw的区别
(一) OnPaint 和 OnDraw (1)OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中. (2)OnP ...
- ngingx安装错误 ./configure: error: the HTTP rewrite module requires the PCRE library.
有时候,我们需要单独安装nginx,来处理大量的下载请求.单独在Centos5安装nginx遇到的rewrite和HTTP cache错误解决办法: wget http://nginx.org/do ...
- IDA + VMware 调试win7 x64
IDA+gdb配合VMware调试windows已经不是什么新鲜事了,但是之所以要发这篇帖子是因为我按照之前的帖子还有网上其他的教程设置调试环境,结果遇到了各种问题,所以仅仅是更新一下,各位轻拍. 环 ...
- open-falcon之HBS
功能 处理agent心跳请求,并将agent信息(ip.hostname.agent_version.plugin_version)等信息入库(portal库) 为agent提供执行run api的白 ...
- PHP多种序列化/反序列化的方法
序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 1. serialize和 ...
- Linux用户态程序计时方式详解
前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序 ...
- liunx trac 邮件提示功能
http://trac.edgewall.org/wiki/TracNotification官网上提供的方法.个人觉得不是清楚,不过还是有参考价值的.以下写下自己的添加过程,以作记录. 1.the [ ...
- 转载>>六款大数据采集平台的架构分析
随着大数据越来越被重视,数据采集的挑战变的尤为突出.今天为大家介绍几款数据采集平台: Apache Flume Fluentd Logstash Chukwa Scribe Splunk Forwar ...
- android make-standalone-toolchain.sh 使用说明
#$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --platform=android-24 --install-dir=./android ...