zoukankan      html  css  js  c++  java
  • BZOJ 4008: [HNOI2015]亚瑟王 [DP 概率 !!!]

    传送门

    题意:

    $r$轮$n$张卡牌,每一轮依次考虑每张卡牌,$p_i$概率发动造成$d_i$伤害后结束本轮或者继续考虑下一张

    每张卡牌发动过之后以后都会跳过

    求$r$轮之后的期望伤害


    看了一节课出题人的做法,并不知道该怎么写代码,感觉带着除法精度好玄学....

    发现网上的题解都是另一种做法

    $f[i][j]$表示第$i$张牌被考虑了$j$次的概率

    有两个转移:

    $1. $上一张牌考虑了$j$次都不发动

    $2. $上一张牌考虑了$j+1$次,之前$k$次不发动,第$k$次发动了,$a*sumlimits_{k=0}^{j}{(1-a)^k}$等比数列求和

    $f[i][j]=f[i-1][j]*(1-p_{i-1})^j + f[i-1][j+1]*(1-(1-p_{i-1})^{j+1})$

     

    我现在还不太明白两种做法有什么联系

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    const int N=225;
    typedef double ld;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,r,d[N];
    double x;
    ld p[N],f[N][N];
    ld g[N][N];
    int main(){
        freopen("in","r",stdin);
        int T=read();
        while(T--){
            //memset(f,0,sizeof(f));
            n=read();r=read();
            for(int i=1;i<=n;i++) 
                scanf("%lf",&x),p[i]=x,d[i]=read();
            memset(f[0],0,sizeof(f[0]));
            f[0][r]=1;
            ld ans=0;
            for(int i=1;i<=r;i++) g[0][i]=1;
            for(int i=1;i<=n;i++) g[i][0]=1;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=r;j++){
                    f[i][j]=f[i-1][j]*g[i-1][j];
                    if(j+1<=r) f[i][j]+=f[i-1][j+1]*( 1-g[i-1][j+1] );
                    g[i][j]=g[i][j-1]*(1-p[i]);
                    ans+=f[i][j]*( 1-g[i][j] )*d[i];
                }
            printf("%.10lf
    ",(double)ans);
        }
    }
  • 相关阅读:
    猪猪的机器学习笔记(八)聚类
    猪猪的机器学习笔记(七)最大熵模型
    猪猪的机器学习笔记(九)推荐系统
    标签button:点击button按钮时,出现了页面自动刷新的情况
    SQL案例
    SQL学习记录:函数(二)
    SQL学习记录:定义(一)
    C# 后台报错输出到日志
    DateTime 时间类型总结(前端)
    笛卡尔积的使用
  • 原文地址:https://www.cnblogs.com/candy99/p/6504838.html
Copyright © 2011-2022 走看看