bzoj4720 [NOIP2016] 换教室(期望概率DP)
来源:互联网 发布:淘宝上卖精密管犯法吗? 编辑:程序博客网 时间:2024/05/21 10:39
原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=4720
题意:
现有v个点和e条边,每条边有边权。n个时刻,在i时刻应前往地点c[i],可申请前往地点d[i],有p[i]的几率申请成功,最多申请m次。如何分配申请使得期望经过的距离最小,求期望的最小距离。
v<=300,n,m<=2000,e<=90000
题解:
dp[i][j][k]: i 时刻,到当前时刻提交了 j 个申请,且 i 时刻 不提交/提交 的最小期望。
转移 :
边界:
注意:输入时有重边要取最小值(WA点),每两点之间的最短路用floyed ,最终复杂度 O(v^3+mn)。
代码:
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=2005;const int M=305;const int inf=1e6;int dis[M][M];int n,m,v,e;int c[N][2];double p[N],dp[N][N][2];double mi(double A,double B){ return A<B?A:B;}int main(){ scanf("%d%d%d%d",&n,&m,&v,&e); for(int i=1;i<=n;i++) scanf("%d",&c[i][0]); for(int i=1;i<=n;i++) scanf("%d",&c[i][1]); for(int i=1;i<=n;i++) scanf("%lf",&p[i]); for(int i=0;i<=v;i++) for(int j=0;j<=v;j++) dis[i][j]=inf; for(int i=1;i<=v;i++) dis[i][i]=0; for(int i=1;i<=e;i++) { int ai,bi,wi; scanf("%d%d%d",&ai,&bi,&wi); dis[ai][bi]=min(wi,dis[ai][bi]); dis[bi][ai]=min(wi,dis[bi][ai]); } for(int k=1;k<=v;k++) for(int i=1;i<=v;i++) for(int j=1;j<=v;j++) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=1;k++) dp[i][j][k]=inf; dp[1][1][1]=dp[1][0][0]=0; for(int i=2;i<=n;i++) { for(int j=0;j<=min(m,i);j++) { dp[i][j][0]=dp[i-1][j][0]+(double)dis[c[i-1][0]][c[i][0]]; if(j>=1) { dp[i][j][0]=min(dp[i][j][0],p[i-1]*(dp[i-1][j][1]+(double)dis[c[i-1][1]][c[i][0]])+(1-p[i-1])*(dp[i-1][j][1]+(double)dis[c[i-1][0]][c[i][0]])); dp[i][j][1]=min(dp[i][j][1],p[i]*(dp[i-1][j-1][0]+(double)dis[c[i-1][0]][c[i][1]])+(1-p[i])*(dp[i-1][j-1][0]+(double)dis[c[i-1][0]][c[i][0]])); } if(j>=2) { dp[i][j][1]=min(dp[i][j][1],p[i]*p[i-1]*(dp[i-1][j-1][1]+(double)dis[c[i-1][1]][c[i][1]]) +p[i]*(1-p[i-1])*(dp[i-1][j-1][1]+(double)dis[c[i-1][0]][c[i][1]]) +(1-p[i])*p[i-1]*(dp[i-1][j-1][1]+(double)dis[c[i-1][1]][c[i][0]]) +(1-p[i])*(1-p[i-1])*(dp[i-1][j-1][1]+(double)dis[c[i-1][0]][c[i][0]])); } } } double ans=inf; for(int i=0;i<=m;i++) ans=min(ans,min(dp[n][i][0],dp[n][i][1])); printf("%0.2lf",ans); return 0;}
- bzoj4720 [NOIP2016] 换教室(期望概率DP)
- BZOJ4720(NOIP2016)[换教室]题解--期望DP
- [BZOJ4720][NOIP2016]换教室-期望DP
- [bzoj4720][Noip2016]换教室 签到概率DP
- 【期望DP+最短路】BZOJ4720 [NOIP2016]换教室
- BZOJ4720 [Noip2016]换教室 解题报告【SPFA】【期望DP】
- NOIP2016[换教室] 期望概率DP
- BZOJ4720 [Noip2016]换教室
- bzoj4720 [Noip2016]换教室
- bzoj4720: [Noip2016]换教室
- bzoj4720 [Noip2016]换教室
- 【bzoj4720】【noip2016】【换座位】期望dp+Floyd
- 【NOIP2016】换教室(期望dp)
- 【期望dp】NOIP2016换教室
- noip2016 换教室 期望+DP
- NOIP2016 换教室 期望DP
- bzoj 4720(NOIP2016) 换教室 期望DP+SPFA
- bzoj 4720: [Noip2016]换教室 (期望dp)
- SEO:前端SEO优化技巧
- HDU
- 乱序执行的原理
- 自定义控件之ViewConfiguration的简单总结
- SVM简介
- bzoj4720 [NOIP2016] 换教室(期望概率DP)
- 什么是RPC?
- STM32 Printf函数利用标准库实现方法
- 深入分析Java Web技术内幕pdf
- 新闻资讯类的数据表
- Curator分布式锁注意事项
- 内网和外网的区别
- 数据的预处理
- 软件开发项目最困难的是什么,我们该怎么办