ZOJ 3640 Help Me Escape

Help Me Escape

题目意思: 一个吸血鬼,每天有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 } + sum { (1 + dp[v + c[i]])/n } ;对于路i,如果v大于路i的限制,那么就能够用ti逃出去,概率为{1/n}否则只能进入下一天的尝试,所以需要用的时间为dp[v + c[i]] + 1 ,概率为{1/n}; 直接使用记忆化搜索的方式写。

/*
    author    : csuchenan
    prog      : zoj3640
    algorithm : probability DP  
    Accepted	3640	C++	1270	1744	chenan
*/
#include <cstdio>
#include <cstring>
#include <cmath>
const int maxn = 200010 ;
int c[110] ;
double dp[maxn] ;
int n , f ;

double dfs(int v){
    if(dp[v] > 0)
        return dp[v] ;
    dp[v] = 0 ;
    for(int i = 0 ; i < n ; i ++){
        //直接从f点逃出去
        if(v > c[i]){
            double temp = (1.0 + sqrt(5.0))/2 * c[i] * c[i] ;
            int t = (int) temp  ;
            dp[v] += t * 1.0 / n ;
        }
        else{
            dp[v] += (1 + dfs(v + c[i]))/n ;
        }
    }
    return dp[v] ;
}
int main(){
    freopen("test.in" ,"r" , stdin);
    while(scanf("%d%d" , &n , &f) != EOF){
        for(int i = 0 ; i < n ; i ++)
            scanf("%d" , &c[i]) ;
        memset(dp , 0 , sizeof(dp)) ;

        dfs(f) ;
        printf("%.3f\n" , dp[f])  ;
    }
    return 0 ;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值