紫书例题 10-20 你想当2 n 元富翁吗?UVa 10900

题意:
在一个电视娱乐节目中,你一开始有1元钱。主持人会问你n个问题,每次你听到问题后
有两个选择:一是放弃回答该问题,退出游戏,拿走奖金;二是回答问题。如果回答正确,
奖金加倍;如果回答错误,游戏结束,你一分钱也拿不到。如果正确地回答完所有n个问
题,你将拿走所有的2 n 元钱,成为2 n 元富翁。
当然,回答问题是有风险的。每次听到问题后,你可以立刻估计出答对的概率。由于主
持人会随机问问题,你可以认为每个问题的答对概率在t和1之间均匀分布。输入整数n和实
数t(1≤n≤30,0≤t≤1),你的任务是求出在最优策略下,拿走的奖金金额的期望值。这里的
最优策略是指让奖金的期望值尽量大。
解题思路:来自紫书教材

假设你刚开始游戏,如果直接放弃,奖金为1;如果回答,期望奖金是多少呢?不仅和
第1题的答对概率p相关,而且和答后面的题的情况相关。即:
选择“回答第1题”后的期望奖金 = p * 答对1题后的最大期望奖金
注意,上式中“答对1题后的最大期望奖金”和这次的p无关,这提示我们用递推的思想,
用d[i]表示“答对i题后的最大期望奖金”,再加上“不回答”时的情况,可以得到:若第1题答对
概率为p,期望奖金的最大值 = max{2 0 , p*d[1]}
这里故意写成2 0 ,强调这是“答对0题后放弃”所得到的最终奖金。
上述分析可以推广到一般情况,但是要注意一点:到目前为止,一直假定p是已知的,
而p实际上并不固定,而是在t~1内均匀分布。根据连续概率的定义,d[i]在概念上等于
max{2 i , p*d[i+1]}在p=t~1上的积分。不要害怕“积分”二字,因为虽然在概念上这是一个积
分,但是落实到具体的解法上,仍然只需要基础知识。
因为有max函数的存在,需要分两种情况讨论,即p*d[i+1]<2 i 和p*d[i+1]≥2 i 两种情况。
令p 0 =max{t, 2 i /d[i+1]}(加了一个max是因为根据题目,p≥t),则:
p

#include <bits/stdc++.h>
using namespace std;
double d[32], t;
int n;
int main(){
    while(scanf("%d%lf", &n, &t) != EOF){
        if(n == 0 && t == 0) break;
        d[n] = pow(2, n);
        for(int i = n - 1; i >= 0; i--){
            double p0 = max(t, pow(2, i) / d[i+1]);
            double p1 = (p0 - t) / (1.0 - t);
            d[i] = pow(2, i) * p1 + (1.0 + p0) * d[i+1] * (1 - p1) / 2.0;
        }
        printf("%.3f\n", d[0]);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值