洛谷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]有两种情况:一是我们的主角 ...
随机推荐
- Nginx 域名重定向
假设 www.old.com 为旧的域名,而 www.new.com 为新的域名,要实现当我们访问 new 的时候自动重定向到 old 域名,配置如下: server { //第一种配置方法 serv ...
- 安装.NET Framework 3.5
https://www.microsoft.com/zh-CN/download/details.aspx?id=22 https://docs.microsoft.com/zh-cn/dotnet/ ...
- weblogic12C出现“java.lang.ArrayIndexOutOfBoundsException: 48188”
最近将10G的一个项目转移到12C出现数组越界的问题: 解决办法: jaxen-1.1.1.jarxom-1.0.jaricu4j-2.6.1.jar 把项目中这三个jar包删除后就可以正常部署了 ...
- 嵌入式之UBOOT
嵌入式Linux系统的结构分为四个区,如图所示: 1.Bootloader区存放的是Bootloader,Coidre972开发板上使用的uboot,它负责嵌入式系统最初的硬件初始化.驱动和内核加载. ...
- Python进阶 学习笔记(二)
(涉及内容:面向对象,类的继承) 定义类并创建实例 在Python中,类通过 class 关键字定义.以 Person 为例,定义一个Person类如下: class Person(object): ...
- Android学习之Gallery
在Android中,画廊控件Gallery用来显示图片列表,可以用手指直接拖动图片左右移动.Gallery只能水平显示一行,且Gallery列表中的图片会根据不同的拖动情况向左或向右移动,直到显示到最 ...
- 使用CreateProcess创建新的process 并返回process运行结束返回值
转自:http://blog.csdn.net/zgl7903/article/details/5975284 转载这篇主要是记住:获得create的新进程运行结束时的返回值的方法 如下: #in ...
- 清空Cookie
function delCookie() { ; i < cookies.length; i++) { try { document.cookie = cookies[i] + "=0 ...
- 【前端安全】JavaScript防http劫持与XSS (转)
作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site scripting).CSRF跨站请求伪造(Cross-site request forgery).但是一直都没有深入研究过 ...
- 微信内置浏览器浏览H5页面弹出的键盘遮盖文本框的解决办法(转)
最近在做微信公众号的内嵌页面,发现点击输入框时键盘盖住文本框,找到一段代码解决了这个问题. iOS和android手机都已亲测,需要的可以直接拷贝到代码中使用. js代码如下: $(function ...