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

不过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. CSS学习笔记05 display属性

    HTML标记一般分为块标记和行内标记两种类型,它们也称块元素和行内元素. 块元素 每个块元素通常都会独自占据一整行或多整行,可以对其设置宽度.高度.对齐等属性,常用于网页布局和网页结构的搭建.并且块级 ...

  2. stringsteam使用之整型转字符串

    最近需要用到整型转字符串的操作,学习了stringstream一些皮毛. 首先需要包含头文件. #include<sstream> 然后用流操作的方式将值传递给stringstream对象 ...

  3. Sublime Text 3 注册码

    最近觉得Sublime Text3比Notepad++好使,可惜需要购买,于是网上搜了一下,屌丝的福音啊: Sublime Text Build 3065 License key复制如下三个任意一个正 ...

  4. Java读取数据源相关信息

    一.采用读取数据源配置文件的方式 package com.ofsp.utils; import java.io.IOException; import java.io.InputStream; imp ...

  5. vijos1062题解

    题目: 交谊舞是2个人跳的,而且一男一女 -____-||||. 由于交谊舞之前的节目安排,所有的表演者都站成了一排.这一排人的顺序满足2点: ①对于一对舞伴男生站在女生的左边. ②任何一对舞伴之间, ...

  6. Android Project和app中两个build.gradle配置的区别

    Android 开发也挺长时间了,从开始就使用的AndroidStudio开发,但是说下来其实自己对AS(AndroidStudio简称)还真的是不了解不深入.好吧,其实我只知道AS是一个相当强大的工 ...

  7. Jenkins设置svn授权

    1.问题引入 在job的scm部分,subversion modules/credentials出现错误 "Unable to access https://xxx/code : svn: ...

  8. 获取子物体数量---Transform.childCount

    如何判断一个物体下是否有子物体?getchild(0)!=null?显然不可取 那去获取拿到子物体数量?transform.GetChildCount();可以解决 但在新版本中已被弃用,可用tran ...

  9. SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域

    SpringMvc支持跨域访问,Spring跨域访问,SpringMvc @CrossOrigin 跨域 >>>>>>>>>>>> ...

  10. EntityManager 实例化方法

    Configure the EntityManager via a persistence.xml file <persistence xmlns="http://java.sun.c ...