紫书 例题 10-20 UVa 10900(连续概率)

分两类,当前第i题答或不答

如果不回答的话最大期望奖金为2的i次方

如果回答的话等于p* 下一道题的最大期望奖金

那么显然我们要取最大值

所以就要分类讨论

我们设答对i题后的最大期望奖金为d[i] 

 显然临界点,也就是这两种情况相等的时候

p0 = 2^i / d[i+1] 

那么因为题目说概率在t到1之间

所以p0最小为t,代码中要取max

当前概率在t到1之间

那么当p在t到p0这个范围内,p<p0,这个时候 p*d[i+1] < 2^i,那显然选 2^i

在这个范围内的概率是 p1 =(p0 - t) / (1 - t)

那么这个时候期望是 p1 *  2^i

那么当p在p0到1这个范围内,p>=p0,这个时候 p*d[i+1] >= 2^i,那显然选 p*d[i+1]

在这个范围内的概率是 (1-p1), 而p要取(1+p0)/2

那么这个时候期望是(1+p0)/2 * d[i+1] * (1-p1)

两种情况的期望值加起来就是递推公式了

从d[n]=2^n递推到d[0]即为答案

#include<cstdio>
#include<cmath>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

const int MAXN = 35;
double d[MAXN];

int main()
{
	int n;
	double t;
	while(~scanf("%d%lf", &n, &t) && n)
	{
		d[n] = 1 << n;
		for(int i = n - 1; i >= 0; i--)
		{
			double p0 = fmax(t, (double)(1 << i) / d[i+1]);
			double p1 = (p0 - t) / (1 - t);
			d[i] = (1 << i) * p1 + (1 + p0) / 2 * d[i+1] * (1 - p1);
		}
		printf("%.3lf\n", d[0]);
	}	
	return 0;
}

 

 

 

转载于:https://www.cnblogs.com/sugewud/p/9819499.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值