2018 吉林 ccpc D The Moon HDU 6558

The Moon

HDU 6558

分析

经典的概率dp题

dp[q][p]表示概率为p,q的期望

当q为1000时:

期望为Sn=p+2*p*(1-p)+3*p*(1-p)^2+------+n*p*(1-p)^(n-1)

Sn-(1-p)*Sn=2--------------------------->Sn=1/p

已知dp[q+20][p]和dp[q+15][p]求dp[q][p]

dp[q][p]与dp[q+20][p]相差一步,相当于q为初值为第一场,第一场期望为1*p*q;

              q+20的第一场即为q的第二场,即dp[q+20][p]要加p+p*(1-p)+-----+p*(1-p)^(n-1)

              由等比数列求值即为加1。

dp[q][p]与dp[q+15][p]相差一步,,dp[q+15][p]要加1

dp[q][p]=p*q+p*(1-q)*(dp[q+20][p]+1)+(1-p)*(dp[q+15][p]+1)

            =p*q+p*(1-q)+(1-p)+p*(1-q)*dp[q+20][p]+(1-p)*dp[q+15][p]

           =1+p*(1-q)*dp[q+20][p]+(1-p)*dp[q+15][p]

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#pragma warning (disable:4996)
const int maxn = 1005;
long double dp[maxn][101];
long double dfs(int q, int p)
{
	if (dp[q][p] > 0)return dp[q][p];
	dp[q][p] = 1 + p / 100.0 * (1000 - q) / 1000 * dfs(min(q + 20, 1000), p) + (100.0 - p) * dfs(min(q + 15, 1000), p) / 100;
	return dp[q][p];
}
int main() {
	int n, p;
	scanf("%d", &n);
	for (int i = 1; i <= 100; i++)dp[1000][i] = 100.0 / i;
	for (int k = 1; k <= n; k++) {
		scanf("%d", &p);
		printf("Case %d: %.10Lf\n", k, dfs(20, p));
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值