ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(LightOJ - 1395)Dangerous Maze (II)(期望DP)

2021-10-26 18:02:04  阅读:236  来源: 互联网

标签:1.0 Dangerous LightOJ sum2 sum1 II cnt2 cnt1 dp


题目链接:A Dangerous Maze (II) - LightOJ 1395 - Virtual Judge (ppsucxtt.cn)

题意:一个迷宫有n扇门,每个门对应一个非零值x,如果x是正的,就会在x分钟后带你逃离迷宫,如果x是负的,就会在(-x)分钟后带你回到原点,你会记录你最后走的k扇门,问你走出迷宫的时间期望。

这道题目是之前做过的一道题目的变形,上道题目博客链接:(58条消息) (LightOJ - 1027)A Dangerous Maze(数学期望)_AC__dream的博客-CSDN博客

之前的那道题目中你不存在记忆,而这道题目中你会对之前走过的门保留一定的记忆,这就是两道题目的不同点,我们可以设dp[i]表示你已经保留了i扇门的记忆,此时你想要出去所要花费的时间期望,需要注意的一点时,你保留的记忆一定是错误的门,因为你一旦走到了正确的门你将会直接出去而省去接下来的过程,我们先来分析一下dp数组如何更新:

 于是就有动态转移方程:dp[i]=1.0*(cnt2-i)/(cnt1+cnt2-i)*dp[i+1]+1.0*(sum1+1.0*sum2/cnt2*(cnt2-i))/(cnt1+cnt2-i);

我们现在来考虑一下终止状态:

如果k>=cnt2,当我们记忆完所有的错误门时,一定有下次成功的概率为1,直接定义终止时的dp值为sum1/cnt1即可

如果k<cnt2,则当我们记忆完k扇门时,下一次一共有cnt1+cnt2-k扇门供我们选择,成功的概率为cnt1/(cnt1+cnt2-k),如果不成功概率不变,直到成功为止,所以这是一个几何分布模型,成功的期望次数就是成功概率的倒数,也就是(cnt1+cnt2-k)/cnt1,每次花费的时间是当前所有情况的平均时间,也就是(sum1+sum2/cnt2*(cnt2-k))/(cnt1+cnt2-k),每次的平均时间乘以期望次数就是期望时间了,接下来直接进行动态转移就好了,最后不要忘记特判没有正值门的情况。

下面是代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=200;
double f[N];
//f[i]表示已经记住i扇门后出去的期望时间
int main()
{
	int T,cnt1,sum1,cnt2,sum2;
	cin>>T;
	for(int o=1;o<=T;o++)
	{
		cnt1=sum1=cnt2=sum2=0;
		int n,t,k;
		scanf("%d%d",&n,&k);
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&t);
			if(t>0) cnt1++,sum1+=t;
			else cnt2++,sum2-=t;
		}
		if(cnt2==n)
		{
			printf("Case %d: -1\n",o);
			continue;
		}
		if(k>=cnt2) f[k=cnt2]=1.0*sum1/cnt1;
		else f[k]=1.0*(sum1+1.0*sum2/cnt2*(cnt2-k))/(cnt1+cnt2-k)*(cnt1+cnt2-k)/cnt1;
		for(int i=k-1;i>=0;i--)
			f[i]=1.0*(cnt2-i)/(cnt1+cnt2-i)*f[i+1]+1.0*(sum1+1.0*sum2/cnt2*(cnt2-i))/(cnt1+cnt2-i);
		printf("Case %d: %.10lf\n",o,f[0]);
	}
	return 0;
}

标签:1.0,Dangerous,LightOJ,sum2,sum1,II,cnt2,cnt1,dp
来源: https://blog.csdn.net/AC__dream/article/details/120975880

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有