[ZOJ3640]Help Me Escape(概率期望dp)

245 篇文章 0 订阅
34 篇文章 0 订阅

题目描述

传送门
题意:某一个人,初始战斗值为f,面临着n条道路,每一条道路有一个困难程度ti,和锻炼值ci。每一天他会等概率地选择一条道路,如果他的战斗值大于ci,那么他会花费ti的天数走出去,否则他走不出去,但是战斗值增加ti。ti和ci的关系满足ti=floor((1+sqrt(5))*0.5*ci*ci)
给出n,f,ci,问这个人走出去的期望天数

题解

令f(i)表示战斗值为i时走出去的期望天数
令Max为ci中的最大值
因为战斗力可能超过Max,所以f(i)从Max*2开始
然后根据i和cj的关系转移

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

int n,m,Max,c[105];
double t[105],f[30005];

void clear()
{
    Max=0;
    memset(c,0,sizeof(c));
    memset(t,0,sizeof(t));
    memset(f,0,sizeof(f));
}
int main()
{
    while (~scanf("%d%d",&n,&m))
    {
        clear();
        for (int i=1;i<=n;++i)
        {
            scanf("%d",&c[i]),Max=max(Max,c[i]);
            t[i]=(double)floor((1.0+sqrt(5.0))*0.5*(double)c[i]*(double)c[i]);
        }
        if (m>Max)
        {
            puts("1.000");
            continue;
        }
        for (int i=Max*2;i>=m;--i)
            for (int j=1;j<=n;++j)
                if (i>c[j]) f[i]+=t[j]/(double)n;
                else f[i]+=(f[i+c[j]]+1)/(double)n;
        printf("%.3lf\n",f[m]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值