博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[洛谷P1850]换教室 概率与期望
阅读量:4347 次
发布时间:2019-06-07

本文共 4233 字,大约阅读时间需要 14 分钟。

要分清哪些状态是独立的,哪些状态对期望有影响

一开始傻傻的在通过和没通过之间取min……
事实上,在求期望的前提下,真正影响的决策是是否申请
以及万万没想到Floyd打次了
map[i][i] = 0才对


发现当前时间段的状态仅仅可以由上一时间段的状态转移来

上一时间段的情况可能有以下几种

1、申请了换教室,过

2、申请了换教室,没过
3、没申请换教室

如果没有概率且我们要求的只是最大/最小值,就在换、未换两种情况里取min

但发现我们每个时间段需要做的决策不是换/不换
而是申请/不申请
(1、2两种状态不是我们能够决策的,他们出现的概率已经确定)
所以每个时间点就申请/不申请划分状态
dp[i][j][0/1]表示i时间段,总共申请了j段,而第i段申请/未申请

来梳理状态间的关系:

\(B_i\)为原教室,\(C_i\)为更换后的教室
求i - 1 ~ i距离的时候,可能出现的状况有:
1、第i - 1时间段在\(B_{i - 1}\),第i时间段在\(B_i\)
2、第i - 1时间段在\(C_{i - 1}\),第i时间段在\(B_i\)
3、第i - 1时间段在\(B_{i - 1}\),第i时间段在\(C_{i}\)
4、第i - 1时间段在\(C_{i - 1}\),第i时间段在\(C_{i}\)

当阶段i我们选择不申请时:

第i时间段在\(B_i\)的概率:1
第i时间段在\(C_i\)的概率:0

若从第i - 1阶段未申请的状态转移过来

第i - 1时间段在\(B_{i - 1}\)的概率:1
第i - 1时间段在\(C_{i - 1}\)的概率:0
综上,这个转移为
\[dp[i][j][0] = dp[i - 1][j][0] + map[$B_{i - 1}$][$B_{i}$] * 1 * 1 + map[$C_{i - 1}$][$B_{i}$] * 0 * 1 + map[$B_{i - 1}$][$C_{i}$] * 1 * 0 + map[$C_{i - 1}$][$C_{i}$] * 0 * 0;\]

类比一下,若从i - 1申请了的状态转移过来

第i时间段在\(B_i\)的概率:1
第i时间段在\(C_i\)的概率:0
第i - 1时间段在\(B_{i - 1}\)的概率:P[i - 1]
第i - 1时间段在\(C_{i - 1}\)的概率:1 - P[i - 1]

这个转移为

\[dp[i][j][0] = dp[i - 1][j][1] + map[$B_{i - 1}$][$B_{i}$] * (1 - P[i]) * 1 + map[$C_{i - 1}$][$B_{i}$] * P[i] * 1 + map[$B_{i - 1}$][$C_{i}$] * 1 * 0 + map[$C_{i - 1}$][$C_{i}$] * 0 * 0\]

继续类比

当阶段i我们选择申请时:
转移同样有两种可能,i - 1申请/未申请
i - 1未申请时:
第i时间段在\(B_i\)的概率:P[i]
第i时间段在\(C_i\)的概率:(1 - P[i])
第i - 1时间段在\(B_{i - 1}\)的概率:1
第i - 1时间段在\(C_{i - 1}\)的概率:0
这个转移为:
\[dp[i][j][0] = dp[i - 1][j][0] + map[$B_{i - 1}$][$B_{i}$] * 1 * P[i] + map[$C_{i - 1}$][$B_{i}$] * 0 * P[i] + map[$B_{i - 1}$][$C_{i}$] * 1 * (1 - P[i]) + map[$C_{i - 1}$][$C_{i}$] * 0 * (1 - P[i])\]

若从i - 1申请转来

第i时间段在\(B_i\)的概率:P[i]
第i时间段在\(C_i\)的概率:(1 - P[i])
第i - 1时间段在\(B_{i - 1}\)的概率:P[i - 1]
第i - 1时间段在\(C_{i - 1}\)的概率:1 - P[i - 1]
这个转移为:
\[dp[i][j][0] = dp[i - 1][j][0] + map[$B_{i - 1}$][$B_{i}$] * P[i - 1] * P[i] + map[$C_{i - 1}$][$B_{i}$] * (1 - P[i - 1]) * P[i] + map[$B_{i - 1}$][$C_{i}$] * P[i - 1] * (1 - P[i]) + map[$C_{i - 1}$][$C_{i}$] * (1 - P[i - 1]) * (1 - P[i])\]

代码如下:

#include
#include
#include
#include
#define INF 1061109567#define LL long longusing namespace std;const int M = 2000 + 50;LL map[M][M],c;double dp[M][M][2],P[M];int n,m,v,e;int a,b,B[M],C[M];int main(){ scanf("%d%d%d%d",&n,&m,&v,&e); for(int i = 1;i <= n;i ++){ scanf("%d",&B[i]); } for(int i = 1;i <= n;i ++){ scanf("%d",&C[i]); } for(int i = 1;i <= n;i ++){ scanf("%lf",&P[i]); } memset(map,0x3f,sizeof(map)); for(int i = 1;i <= v;i ++){ map[i][i] = 0; } for(int i = 1;i <= e;i ++){ scanf("%d%d%lld",&a,&b,&c); if(map[a][b] > c)map[a][b] = c,map[b][a] = c; } for(int k = 1;k <= v;k ++){ for(int i = 1;i <= v;i ++){ for(int j = 1;j <= v;j ++){ if(map[i][j] > map[i][k] + map[k][j] && map[i][j] != INF && map[k][j] != INF) map[i][j] = map[i][k] + map[k][j]; } } } for(int i = 0;i <= n;i ++){ for(int j = 0;j <= n;j ++) dp[i][j][0] = dp[i][j][1] = INF; } dp[1][0][0] = dp[1][1][1] = 0; for(int i = 2;i <= n;i ++){ for(int k = min(i,m);k >= 0;k --){ dp[i][k][0] = min(dp[i][k][0],dp[i - 1][k][0] + map[B[i - 1]][B[i]]); dp[i][k][0] = min(dp[i][k][0],dp[i - 1][k][1] + map[B[i - 1]][B[i]]*(1 - P[i - 1]) + map[C[i - 1]][B[i]]*P[i - 1]); //if(i >= 3 && !dp[i][k][0])printf("haha%d\n",i); if(k >= 1){ dp[i][k][1] = min(dp[i][k][1],dp[i - 1][k - 1][0] + map[B[i - 1]][B[i]]*(1 - P[i]) + map[B[i - 1]][C[i]]*P[i]); dp[i][k][1] = min(dp[i][k][1],dp[i - 1][k - 1][1] + map[B[i - 1]][B[i]]*(1 - P[i - 1])*(1 - P[i]) + map[C[i - 1]][B[i]]*P[i - 1]*(1 - P[i]) + map[B[i - 1]][C[i]]*(1 - P[i - 1])*P[i] + map[C[i - 1]][C[i]]*P[i - 1]*P[i]); } } } double ans = INF; for(int i = 0;i <= m;i ++){ ans = min(ans,min(dp[n][i][0],dp[n][i][1])); } /* ans = 0; for(int i = 2;i <= n;i ++){ ans += map[B[i - 1]][B[i]]; }*/ printf("%.2lf",ans);}

转载于:https://www.cnblogs.com/loi-pingxing/p/7786544.html

你可能感兴趣的文章
HTML转换为PDF
查看>>
邮件加密和签名
查看>>
自己动手写一个单链表
查看>>
生产者与消费者(综合案例)
查看>>
集团信息化之路——关于网络电子採购系统的需求报告
查看>>
Android设计模式系列-单例模式
查看>>
hiho一下 第一百零七周 Give My Text Back(微软笔试题)
查看>>
常用正则表达式
查看>>
6.2.7 Math对象的使用
查看>>
Windows server 2008 R2配置多个远程连接的教程
查看>>
PHP 重置数组为连续数字索引的几种方式
查看>>
南阳理工acm 88-汉诺塔(一)
查看>>
160809308周子济第六次作业
查看>>
大型Web应用运行时 PHP负载均衡指南
查看>>
为phpStorm 配置PHP_CodeSniffer自动检查代码
查看>>
测试工具网址大全(转)
查看>>
ServiceStack DotNet Core前期准备
查看>>
webpack中‘vant’全局引入和按需引入【vue-cli】
查看>>
Date、String和Timestamp类型转换
查看>>
计算机的组成
查看>>