洛谷P1850 换教室(概率dp)
我的floyd竟然写错了?今年NOIP怕不是要爆零了?
这就是一个概率dp
我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移
点数只有300,跑一遍floyd
//minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 1e17
using namespace std;
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getchar()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getchar());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=,M=;
int mp[M][M],c[N][],n,m,e,v;double dp[N][N][],k[N],ans;
int main(){
// freopen("testdata.in","r",stdin);
memset(mp,0x3f,sizeof(mp));
n=read(),m=read(),v=read(),e=read();
for(int i=;i<=n;++i) c[i][]=read();
for(int i=;i<=n;++i) c[i][]=read();
for(int i=;i<=n;++i) scanf("%lf",&k[i]);
for(int i=,u,v,w;i<=e;++i){
u=read(),v=read(),w=read();
cmin(mp[u][v],w),cmin(mp[v][u],w);
}
for(int i=;i<=v;++i) mp[i][i]=mp[i][]=mp[][i]=;
for(int k=;k<=v;++k) for(int i=;i<=v;++i) for(int j=;j<=v;++j)
cmin(mp[i][j],mp[i][k]+mp[k][j]);
for(int i=;i<=n;++i) for(int j=;j<=m;++j) dp[i][j][]=dp[i][j][]=inf;
dp[][][]=dp[][][]=;
for(int i=;i<=n;++i){
dp[i][][]=dp[i-][][]+mp[c[i][]][c[i-][]];
for(int j=,l=min(i,m);j<=l;++j){
int c1=c[i][],c2=c[i][],c3=c[i-][],c4=c[i-][];
cmin(dp[i][j][],dp[i-][j][]+mp[c1][c3]);
cmin(dp[i][j][],dp[i-][j][]+mp[c1][c4]*k[i-]+mp[c1][c3]*(-k[i-]));
cmin(dp[i][j][],dp[i-][j-][]+mp[c1][c3]*(-k[i])+mp[c2][c3]*k[i]);
cmin(dp[i][j][],dp[i-][j-][]+mp[c1][c3]*(-k[i-])*(-k[i])+
mp[c2][c3]*(-k[i-])*k[i]+mp[c1][c4]*k[i-]*(-k[i])+mp[c2][c4]*k[i-]*k[i]);
}
}
ans=inf;
for(int i=;i<=m;++i) cmin(ans,dp[n][i][]),cmin(ans,dp[n][i][]);
printf("%.2lf\n",ans);
return ;
}
洛谷P1850 换教室(概率dp)的更多相关文章
- 洛谷 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换教室
题目传送门 理解题意:给定你一个学期的课程和教室数量以及教室之间的距离还有换教室成功的概率,求一个学期走的距离的期望最小值 题目是有够恶心的,属于那种一看就让人不想刷的题目...很明显的动规,但是那个 ...
- P1850 换教室 概率dp
其实说是概率dp,本质上和dp没什么区别,就是把所有可能转移的情况全枚举一下就行了,不过dp方程确实有点长... ps:这个题的floyed我竟然之前写跪了... 题目: 题目描述 对于刚上大学的牛牛 ...
- 洛谷P1850 换教室 [noip2016] 期望dp
正解:期望dp 解题报告: 哇我发现我期望这块真的布星,可能在刷了点儿NOIp之后会去搞一波期望dp的题...感觉连基础都没有打扎实?基础概念都布星! 好那先把这题理顺了嗷qwq 首先我们看到期望就会 ...
- 洛谷P1850 换教室
令人印象深刻的状态转移方程... f[i][j][0/1]表示前i个换j次,第i次是否申请时的期望. 注意可能有重边,自环. 转移要分类讨论,距离是上/这次成功/失败的概率乘相应的路程. 从上次的0/ ...
- 洛谷P1850 换教室_数学期望_Floyd
调了一下午QAQ-让我对数学期望的理解又提升了一个层次. 首先,我们发现 v<=300v<=300v<=300 , 这样我们就可以用 FloydFloydFloyd 算法来 O(n3 ...
- Luogu P1850 换教室(期望dp)
P1850 换教室 题意 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1\l ...
随机推荐
- sql select(A.B)拼接
需要做的工作:把DBtable里边的某两个字段,(当然可以更多)或者不同表,道理类似,用某个符号拼接起来. 比如(Table.A).(Tables.B) oracle里边可以这样写,sql没试: se ...
- CSDN-markdown编辑器之从线上导入Markdown文件
CSDN-markdown编辑器支持从线上导入Markdown文件的功能,假设你用其他支持Markdown的编辑器在网上写了博客文章或说明档,想公布到CSDN博客中,就能够使用本功能非常方便的完毕 ...
- numpy - 数组索引
numpy 数组索引 一.单个元素索引 一维数组索引 >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 8 二 ...
- 李洪强iOS开发之 - enum与typedef enum的用法
李洪强iOS开发之 - enum与typedef enum的用法 01 - 定义枚举类型 上面我们就在ViewController.h定义了一个枚举类型,枚举类型的值默认是连续的自然数,例如例子中的T ...
- linux 命令之 watch
watch能够帮你监測一个命令的执行结果,省得你一遍遍的手动执行.在Linux下.watch是周期性的执行下个程序.并全屏显示执行结果.你能够拿他来监測你想要的一切命令的结果变化,比方 tail 一个 ...
- W5500EVB TCP Server演示
之前给大家展示了p=6471" style="margin:0px; padding:0px; border:0px; font-family:inherit; font-size ...
- 关于HTTP1.1的长连接
HTTP是一个构建在传输层的TCP协议之上的应用层的协议,在这个层的协议,是一种网络交互须要遵守的一种协议规范. HTTP1.0的短连接 HTTP 1.0规定浏览器与server仅仅保持短暂的连接.浏 ...
- Arcgis Engine(ae)接口详解(5):IGeometry几何高级操作
IPoint point = new PointClass(); point.PutCoords(, ); //ITopologicalOperator接口用于几何对象的几何操作 ITopologic ...
- appium-java-api
AppiumDriver getAppStrings() 默认系统语言对应的Strings.xml文件内的数据. driver.getAppStrings(String language) 查找某一个 ...
- SpringMVC中返回JSON时乱码的解决方案
springMVC中返回JSON会出现乱码,解决如下: produces = "text/html;charset=UTF-8" @ResponseBody @RequestMap ...