So you want to be a 2n-aire?【期望DP】

家住魔仙堡 提交于 2019-11-25 16:59:07

传送门
我们用递推的思想, 用d[i]表示“答对i题后的最大期望奖金”,再加上“不回答”时的情况,可以得到:若第1题答对 概率为p,期望奖金的最大值 = max(20,pd[1])max(2^0, p*d[1])
上述分析可以推广到一般情况,但是要注意一点:到目前为止,一直假定p是已知的, 而p实际上并不固定,而是在t1t~1内均匀分布。根据连续概率的定义,d[i]在概念上等于 max(2i,pd[i+1])max(2i, p*d[i+1])p=t1p=t~1上的积分.
因为有max函数的存在,需要分两种情况讨论,即pd[i+1]<2ip*d[i+1]<2^ipd[i+1]2ip*d[i+1]≥2^i两种情况。 令p0=max(t,2i/d[i+1])p0=max(t, 2i/d[i+1])(加了一个max是因为根据题目,ptp≥t),则:

  • p<p0p<p_0时,pd[i+1]<2ip*d[i+1]<2^i,因此“不回答”比较好,期望奖金等于2i2^i

  • pp0p≥p_0时,“回答”比较好,期望奖金等于d[i]乘以p的平均值(d[i]作为常数被“提出
    来”了),即(1+p0)/2d[i+1](1+p_0)/2 * d[i+1]

在第一种情况中,p的实际范围是[t,p0)[t,p_0),因此概率为p1=(p0t)/(1t)p_1=(p_0-t)/(1-t)。根据全期望公 式,d[i]=2ip1+(1+p0)/2d[i+1](1p1)d[i] = 2i * p_1 + (1+p_0)/2 * d[i+1] * (1-p_1)
边界是d[n]=2nd[n] = 2^n,逆向递推出d[0]d[0]就是本题的答案。

#include<iostream>
using namespace std;
const int N=50;
double d[N];
int n;
double t; 
int main(){
	while(cin>>n>>t,n||t){
		d[n]=(1<<n);
		for(int i=n-1;i>=0;i--){
			double p0=(double)(1<<i)/d[i+1];
			if(p0<t) p0=t;
			double p1=(p0-t)/(1-t);
			d[i]=(1<<i)*p1+(1+p0)/2*d[i+1]*(1-p1);
		}
		printf("%.3lf\n",d[0]);
	}	
} 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!