• [BZOJ 4008][HNOI2015]亚瑟王(期望Dp)


    Description

    小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑。

    他决定,在脱坑之前,最后再来打一盘亚瑟王。既然是最后一战,就一定要打得漂
    亮。众所周知,亚瑟王是一个看脸的游戏,技能的发动都是看概率的。作为一个非
    洲人,同时作为一个前 OIer,小 K 自然是希望最大化造成伤害的期望值。但他已
    经多年没写过代码,连 Spaly都敲不对了,因此,希望你能帮帮小 K,让他感受一
    下当欧洲人是怎样的体验。 
    本题中我们将考虑游戏的一个简化版模型。 
    玩家有一套卡牌,共 n张。游戏时,玩家将 n 张卡牌排列成某种顺序,排列后
    将卡牌按从前往后依次编号为 1 ~  n。本题中,顺序已经确定,即为输入的顺序。
    每张卡牌都有一个技能。第 i 张卡牌的技能发动概率为 pi,如果成功发动,则会对
    敌方造成di点伤害。也只有通过发动技能,卡牌才能对敌方造成伤害。基于现实因
    素以及小K非洲血统的考虑,pi不会为 0,也不会为 1,即 0 < pi < 1。 
    一局游戏一共有 r 轮。在每一轮中,系统将从第一张卡牌开始,按照顺序依次
    考虑每张卡牌。在一轮中,对于依次考虑的每一张卡牌: 
    1如果这张卡牌在这一局游戏中已经发动过技能,则 
    1.1 如果这张卡牌不是最后一张,则跳过之(考虑下一张卡牌); 
    否则(是最后一张),结束这一轮游戏。 
    2否则(这张卡牌在这一局游戏中没有发动过技能),设这张卡牌为第 i 张 
    2.1将其以 pi的概率发动技能。 
    2.2如果技能发动,则对敌方造成 di点伤害,并结束这一轮。 
    2.3如果这张卡牌已经是最后一张(即 i 等于n),则结束这一轮;否则,
    考虑下一张卡牌。 
    请帮助小 K 求出这一套卡牌在一局游戏中能造成的伤害的期望值。

    Solution

    感觉是个非常厉害的期望dp…完全没想到…

    卡牌在哪一轮使用其实不重要,用f[i][j]来表示卡牌i到n还有j个发动机会的概率:

    f[i][j]=f[i-1][j]*(1-p[i-1])j+f[i-1][j+1]*[1-(1-p[i-1])j+1]

    于是每个f[i][j]对答案产生的贡献就是f[i][j]*[1-(1-p[i])j]*d[i]

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    using namespace std;
    int t,n,r,d[250];
    double p[250],f[250][150],ans;
    double pow(double a,int n)
    {
        double res=1;
        while(n)
        {
            if(n&1)res*=a;
            a*=a;
            n>>=1;
        }
        return res;
    }
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&r);
            for(int i=1;i<=n;i++)
            scanf("%lf%d",&p[i],&d[i]);
            memset(f,0,sizeof(f));
            f[0][r]=1,ans=0;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=r;j++)
                {
                    f[i][j]=f[i-1][j]*pow(1-p[i-1],j)+f[i-1][j+1]*(1-pow(1-p[i-1],j+1));
                    ans+=f[i][j]*(1-pow(1-p[i],j))*d[i]; 
                }
            }
            printf("%.10lf
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    6.简单总结一下类与对象
    5.创建对象内存分析
    4.构造器详解
    3.类和对象的关系
    业余草推荐18个Java开源免费的CMS系统
    业余草教你解读Spark源码阅读之HistoryServer
    业余草公众号运营攻略:教你一天涨粉200以上
    从菜鸟到大牛的码农升职必学文章推荐
    倒排索引的AND操作
    程序员,如何在工作之外,增加自己的收入
  • 原文地址:https://www.cnblogs.com/Zars19/p/6914446.html
Copyright © 2020-2023  润新知