zoj-3604 Help Me Escape[概率dp]

本文探讨了一个关于吸血鬼逃逸的数学问题,通过概率论和动态规划的方法求解吸血鬼逃离迷宫的期望时间。具体地,考虑一个吸血鬼每天随机选择一条路径并尝试逃离,路径的选择依赖于其当前能力与路径限制条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目意思: 一个吸血鬼,每天有n条路走,
每次随机选一条路走,每条路有限制,
如果当这个吸血鬼的能力大于某个值c[i],
那么只需要花费ti(ti = (1.0 + sqrt(5.0))/2 * c[i] * c[i])
天的时间就可以逃出去,否则,花费1天的时间,
吸血鬼的能力增加c[i],花费1天的时间,然后继续下一天的尝试。

求逃出去的期望。

被这道题的四舍五入坑惨了。

令E(f)表示吸血鬼在战斗力为f的时候逃出去的期望。

对于走每条路 i,概率为1/n有两种考虑

(1)f>c[i],此时吸血鬼可以从这条路逃走 E(f)+=t[i]*(1/n);

(2)f<=c[i],此时吸血鬼得继续下一天的尝试,E(f+c[i])+=(E(f)+1)*(1/n);这里得将公式逆推刚好也是E(f)+=(1+E(f+c[i]))*(1/n);

所以E(f)=∑{t[i]*(1/n)}+∑{(E(j+c[j])+1)*(1/n)}            i表示f>c[i]的路,j表示f<=c[i]的路

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
const int maxn=10008;
const double eps=1E-8;
const double ft=(1.0 + sqrt(5.0))/2.0;
int n;
int c[maxn];
double t[maxn],E[maxn*4];
double DP(int f)
{ 	
	double &res=E[f];
	if(res>eps) return res;
	for(int i=1;i<=n;++i)
	{
		if(f>c[i])	res+=int(t[i])*1.0/n;
		else res+=(1+DP(f+c[i]))*1.0/n;
	}
	return res;
}
void init()
{
	memset(E,0,sizeof(E)); 
	t[0]=0;
	for(int i=1;i<=n;++i)
	{
		t[i]=ft* c[i] * c[i];
	}
}
int main()
{
	int f;
	while(~scanf("%d%d",&n,&f))
	{
		for(int i=1;i<=n;++i)
			scanf("%d",c+i);
		init();
		printf("%.3lf\n",DP(f));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值