ZOJ 3640 Help Me Escape 概率dp

题目大意:

人需要逃出地洞,每个地洞有自己的守卫者。守护者的战力为c[i]。

每天人会被随机的分配到一个地洞的出口前。

当人的战力值f>c[i]时花费天即可逃出。

否则,战力值加上c[i],天数加一,第二天随机出现在一个地洞口。

问逃出去的天数的期望值。


题目分析:

分类讨论

d[i]是武力值为i的时候逃出地洞需要天数的期望值。

1.i> c[j] , d[i] += floor(1+sqrt(5.0))/2 *c[i]^2/n

2.i <= c[j] ,d[i] +=(d(i+c[i])+1)/n

答案就是d[f]


#include <bits/stdc++.h>
using namespace std;
#define N 20005
double d[N];
double c[N];
double p = 0.5+sqrt(5.0)/2;
int n,f;
double dp(int tf){
    //if(tf>N)tf = N-1;
    if(d[tf]>0)return d[tf];
    for(int i=0;i<n;i++){
        if(tf>c[i]){
            d[tf]+=floor(p*c[i]*c[i])/n;
        }else {
            d[tf]+=(dp(tf+c[i])+1)/n;
        }
    }
    return d[tf];
}
int main(){
    //std::ios::sync_with_stdio(false);
    while(cin>>n>>f){
        for(int i=0;i<n;i++){
            cin>>c[i];
        }
        memset(d,0,sizeof(d));
        printf("%.3f\n",dp(f));
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值