考试的时候打了个搜索,时间比较短,样例又非常的弱,实在不太清楚他这个到底是什么意思。

不过lc大神好腻害,讲解了一下非常的清楚了。

f[i][j][k][l]表示第i次伤害(啊),一滴血j个,两滴血k个,三滴血l个的概率。

初始状态f[1][a][b][c]=1

转移状态

1.此次攻击英雄 f[i+1][j][k][l]

2.攻击一个血量为1的仆从→ f[i+1][j-1][k][l]

3.攻击一个血量为2的仆从→ f[i+1][j+1][k-1][l]//超过7个仆从    f[i+1][j+1][k-1][l+1]//不超过7个

4.攻击一个血量为3的仆从→ f[i+1][j][k+1][l-1]//超过7个仆从    f[i+1][j][k+1][l]//不超过7个

那么最后答案应为Σf[i][j][k][l]*1.0*1/(j+k+l+1)

注意:转移时候要看清转移概率的人数。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
#define N 60
double f[N][N][N][N],ans;
int n,a,b,c;
int t;
int main(){
    scanf("%d",&t);
    while(t--){
        memset(f,0,sizeof(f));
        scanf("%d%d%d%d",&n,&a,&b,&c);
        ans=0;
        f[1][a][b][c]=1;
        pos(i,1,n){
            pos(j,0,7){
                pos(k,0,7){
                    pos(l,0,7){
                        if(l+j+k<=7){
                            f[i][j][k][l]+=f[i-1][j][k][l]*(double)1/(j+k+l+1);
                            f[i][j][k][l]+=f[i-1][j+1][k][l]*(double)(j+1)/(j+k+l+2);
                            if(j!=0)
                            {
                              if((j+k+l)==7)
                                  f[i][j][k][l]+=f[i-1][j-1][k+1][l]*(double)(k+1)/(j+k+l+1);
                              f[i][j][k][l]+=f[i-1][j-1][k+1][l-1]*(double)(k+1)/(j+k+l);
                            }
                            if(k!=0)
                            {
                               if((j+k+l)==7)
                                    f[i][j][k][l]+=f[i-1][j][k-1][l+1]*(double)(l+1)/(j+k+l+1);
                               f[i][j][k][l]+=f[i-1][j][k-1][l]*(double)l/(j+k+l);
                            }
                        }
                    }
                }
            }
        }
        pos(i,1,n)
            pos(j,0,7)
                pos(k,0,7)
                    pos(l,0,7)
                     if((l+j+k)<=7)
                      ans+=f[i][j][k][l]*(double)1/(j+k+l+1);
        printf("%0.2lf\n",ans);
    }

    return 0;
}

  

[bzoj4832]抵制克苏恩 概率dp的更多相关文章

  1. [BZOJ4832]抵制克苏恩(概率期望DP)

    方法一:倒推,最常规的期望DP.f[i][a][b][c]表示还要再攻击k次,目前三种随从个数分别为a,b,c的期望攻击英雄次数,直接转移即可. #include<cstdio> #inc ...

  2. [BZOJ4832]抵制克苏恩

    [BZOJ4832]抵制克苏恩 思路: \(f[i][j][k][l]\)表示打了\(i\)次,血量为\(1\sim 3\)的随从有\(j,k,l\)个的期望.转移时注意避免重复. 源代码: #inc ...

  3. 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp

    题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...

  4. 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望

    [BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...

  5. BZOJ4832[Lydsy1704月赛]抵制克苏恩——期望DP

    题目描述 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的 ...

  6. 【bzoj4832】[Lydsy1704月赛]抵制克苏恩 期望dp

    Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 ...

  7. bzoj 4832 抵制克苏恩 概率期望dp

    考试时又翻车了..... 一定要及时调整自己的思路!!! 随从最多有7个,只有三种,所以把每一种随从多开一维 so:f[i][j][k][l]为到第i次攻击前,场上有j个1血,k个2血,l个3血随从的 ...

  8. BZOJ4832 抵制克苏恩(概率期望+动态规划)

    注意到A+B+C很小,容易想到设f[i][A][B][C]为第i次攻击后有A个血量为1.B个血量为2.C个血量为3的期望伤害,倒推暴力转移即可. #include<iostream> #i ...

  9. BZOJ4832: [Lydsy1704月赛]抵制克苏恩(期望DP)

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 913  Solved: 363[Submit][Status][Discuss] Description ...

随机推荐

  1. 如何利用keytool查看一个apk的签名

  2. 4.vbs的循环,switch,判断等语句

    1.条件判断语句 If Then Else Sub judge(x) Then MsgBox "the num is 0" Then MsgBox "the num is ...

  3. Javascript 类继承

    Js继承 JavaScript并不是真正面向对象的语言,是基于对象的,没有类的概念. 要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现 /** 声明一个基础父类 ...

  4. 严重: Could not synchronize database state with session org.hibernate.exception.DataException: Could not execute JDBC batch update

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; color: #ff2600 } p.p2 { margin: 0.0px 0 ...

  5. CentOS上安装Hadoop2.7,添加数据节点,运行wordcount

    安装hadoop的步骤比较繁琐,但是并不难. 在CentOS上安装Hadoop2.7 1. 安装 CentOS,注:图形界面并无必要 2. 在CentOS里设置静态IP,手工编辑如下4个文件 /etc ...

  6. chrome浏览器iframe兼容性问题,隐藏起来再显示滚动条消失?

    前言:在调试页面时发现谷歌浏览器bug,版本: 58.0.3029.81 问题描述: 1. 页面中,选项卡里面是IFrame,页面初始显示时有纵向滚动条出现 2. 来回切换选项卡一次,原来选项卡页面的 ...

  7. git命令小结

    注: 如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文 学习git文档推荐:http://www.liaoxuefeng.com/wiki/00137 ...

  8. 如何生成Azure SAS Token

    在Azure PaaS服务密钥的安全性文章中,提到过客户端实际上发送的是Token,而不是密钥.那么Token是该如何生成呢? Azure相应服务的SDK其实都提供了或者内置了生成Token的方法,可 ...

  9. Java List Remove时要注意的细节

    1.如果你是在遍历的时候去remove一个对象 for(int i = 0, length = list.size(); i<length; i++){} 这种遍历需要每次remove时,对i- ...

  10. Python--my first try!

    我所用的编译器是:Python 3.6.0 我之所以在一开始就说我的编译器是因为不同的编译器,不同的版本在代码的写法上会有一些区别! 比如:在我所用的版本3中print的用法是Print (" ...