zoukankan      html  css  js  c++  java
  • 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp

    打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并加和,一开始我用的期望忘了转移的时候不能用1而要用概率......

    #include <cstdio>
    #include <cstring>
    #define r register
    using namespace std;
    typedef long double LD;
    inline int read()
    {
        r int sum=0;
        r char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch>='0'&&ch<='9')
        {
            sum=(sum<<1)+(sum<<3)+ch-'0';
            ch=getchar();
        }
        return sum;
    }
    LD f[55][10][10][10];
    int main()
    {
      r int T=read();
      while(T--)
      {
        for(r int i=0;i<55;++i)
            for(r int j=0;j<10;++j)
                for(r int l=0;l<10;++l)
                    for(r int k=0;k<10;++k)
                        f[i][j][l][k]=0.0;
        r int K=read(),A=read(),B=read(),C=read();
        f[0][C][B][A]=1.0;
        LD ans=0.0;
        for(r int i=0;i<K;++i)
            for(r int j=0;j<=7;++j)
                for(r int l=0;l+j<=7;++l)
                    for(r int k=0;k+j+l<=7;++k)
                        {
                            f[i+1][j][l][k]+=f[i][j][l][k]/(1+j+l+k);
                            ans+=f[i][j][l][k]/(1+j+l+k);
                            if(k)
                                f[i+1][j][l][k-1]+=f[i][j][l][k]*k/(1+j+l+k);
                            if(j+l+k<7)
                            {
                                if(l)
                                    f[i+1][j+1][l-1][k+1]+=f[i][j][l][k]*l/(1+j+l+k);
                                if(j)
                                    f[i+1][j][l+1][k]+=f[i][j][l][k]*j/(1+j+l+k);
                            }
                            else
                            {
                                if(l)
                                    f[i+1][j][l-1][k+1]+=f[i][j][l][k]*l/(1+j+l+k);
                                if(j)
                                    f[i+1][j-1][l+1][k]+=f[i][j][l][k]*j/(1+j+l+k);
                            }
                        }
        double Ans=ans;
        printf("%.2lf
    ",Ans);
      }
    }
  • 相关阅读:
    tmux commands
    智能指针类HasPtr
    关于Vector中存放指针的问题
    面向对象的理解
    关系模型 超键 候选键 主键
    数据库的三个范式
    static struct QMetaObject const QwtPlot::staticMetaObjec
    static作用(修饰函数、局部变量、全局变量)
    C++全局变量之extern和static
    QTabWidget 使用小记
  • 原文地址:https://www.cnblogs.com/TSHugh/p/7260537.html
Copyright © 2011-2022 走看看