zoj 3640 Help Me Escape(概率DP)

探讨了通过记忆化搜索解决吸血鬼逃逸问题的方法。该问题涉及一个吸血鬼每天随机选择路径并试图逃离的过程,根据其能力变化及路径限制计算逃出的期望时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目意思: 一个吸血鬼,每天有n条路走,每次随机选一条路走,每条路有限制,如果当这个吸血鬼的能力大于某个值c[i],那么只需要花费ti(ti = (1.0 + sqrt(5.0))/2 * c[i] * c[i]) 天的时间就可以逃出去,否则,花费1天的时间,吸血鬼的能力增加c[i],花费1天的时间,然后继续下一天的尝试。求逃出去的期望。

       设dp[v] ,表示当能力值为v的时的期望。所以方程很容易写了,dp[v] = sum{ ti/n }(v直接逃出去) + sum { (1 + dp[v + c[i]])/n }(下一次逃出去) ;对于路i,如果v大于路i的限制,那么就能够用ti逃出去,概率为{1/n}否则只能进入下一天的尝试,所以需要用的时间为dp[v + c[i]] + 1 ,概率为{1/n}; 直接使用记忆化搜索的方式写。


#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
using namespace std;

#define N 20005
double  dp[N],t;
int c[105],n,f;

double dfs(int v)
{
    int i,j;
    if(dp[v]>0) return  dp[v];
    for(i=0;i<n;i++)
    {
       if(v>c[i])
       {
           dp[v]=dp[v]+int(t*c[i]*c[i])*1.0/n;
       }
       else
       {
          dp[v]=dp[v]+(1+dfs(v+c[i]))*1.0/n;
       }

    }
    return dp[v];
}
int main()
{
    int i,j;
    t=(1.0+sqrt(5.0))/2.0;
    while(~scanf("%d%d",&n,&f))
    {
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++)
          scanf("%d",&c[i]);
       printf("%.3lf\n",dfs(f));
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值