迭代是化简公式的常用技巧

dp[i][j]表示队伍中有i人,tomato排在第j位出现情况2的概率,那么先推出公式再进行简化

dp[i][1]=p21*dp[i][i] + p41
j<=k : dp[i][j]=p21*dp[i][j-1] + p31*dp[i-1][j-1] +p41
j>k : dp[i][j]=p21*dp[i][j-1] + p31*dp[i-1][j-1]

可见公式中的dp[i][1]和dp[i][i]是相关的,那么dp[i][j]也和dp[i][i]相关,所以只要迭代求出dp[i][i],然后再递推即可

在求dp[i][j]时所有dp[i-1][j]已经求出,所以后面的都是常数
因为dp[i][1]和dp[i][i]有关,所以需要迭代算方程先求出dp[i][i]
c数组是后面的常数,先处理出来即可

注意用滚动数组压缩内存,并特判

#include<bits/stdc++.h>
using namespace std; const double esp = 1e-;
const int maxn = ;
double c[maxn],pp[maxn],dp[][maxn]; int main(){
double p1,p2,p3,p4;
int n,m,k;
while(scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)!=EOF){
if(p4<esp){puts("0.00000");continue;}
double p21=p2/(-p1),p31=p3/(-p1),p41=p4/(-p1);
pp[]=;c[]=p41;
for(int i=;i<=n;i++)pp[i]=pp[i-]*p21;
dp[][]=p41/(-p21); /*
dp[i][1]=p21*dp[i][i] + p41
j<=k : dp[i][j]=p21*dp[i][j-1] + p31*dp[i-1][j-1] +p41
j>k : dp[i][j]=p21*dp[i][j-1] + p31*dp[i-1][j-1]
在求dp[i][j]时所有dp[i-1][j]已经求出,所以后面的都是常数
因为dp[i][1]和dp[i][i]有关,所以需要迭代算方程先求出dp[i][i]
c数组是后面的常数,先处理出来即可
*/
int cur=;
for(int i=;i<=n;i++){
cur^=;
for(int j=;j<=k;j++)c[j]=p31*dp[cur^][j-]+p41;
for(int j=k+;j<=i;j++)c[j]=p31*dp[cur^][j-];
double tmp=c[]*pp[i-];//通过迭代方程算出dp[i][i]
for(int j=;j<=i;j++)tmp+=c[j]*pp[i-j];
dp[cur][i]=tmp/(-pp[i]);
dp[cur][]=p21*dp[cur][i]+c[];//通过递推算出dp[i][1]及其余项
for(int j=;j<i;j++)dp[cur][j]=p21*dp[cur][j-]+c[j];
}
printf("%.5f\n",dp[cur][m]);
}
}

概率dp——hdu4089推公式+循环迭代的更多相关文章

  1. 概率dp——逆推期望+循环迭代zoj3329

    首先要推出dp[i]的期望方程,会发现每一项都和dp[0]相关, 那我们将dp[i]设为和dp[0]有关的式子dp[i]=a[i]*dp[0]+b[i],然后再回代到原来的期望方程里 然后进行整理,可 ...

  2. BZOJ.1076.[SCOI2008]奖励关(概率DP 倒推)

    题目链接 BZOJ 洛谷 真的题意不明啊.. \(Description\) 你有k次选择的机会,每次将从n种物品中随机一件给你,你可以选择选或不选.选择它会获得这种物品的价值:选择一件物品前需要先选 ...

  3. sgu 495. Kids and Prizes (简单概率dp 正推求期望)

    题目链接 495. Kids and Prizes Time limit per test: 0.25 second(s)Memory limit: 262144 kilobytes input: s ...

  4. hdu 3853 LOOPS (概率dp 逆推求期望)

    题目链接 LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Tota ...

  5. SGU 495 Kids and Prizes:期望dp / 概率dp / 推公式

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 题意: 有n个礼物盒,m个人. 最开始每个礼物盒中都有一个礼物. m个人依次随 ...

  6. HDU 4599 Dice (概率DP+数学+快速幂)

    题意:给定三个表达式,问你求出最小的m1,m2,满足G(m1) >= F(n), G(m2) >= G(n). 析:这个题是一个概率DP,但是并没有那么简单,运算过程很麻烦. 先分析F(n ...

  7. Aeroplane chess(简单概率dp)

    Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz start ...

  8. CF 148D D Bag of mice (概率dp)

    题目链接 D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. Hello 2019 D 素因子贡献法计算期望 + 概率dp + 滚动数组

    https://codeforces.com/contest/1097/problem/D 题意 给你一个n和k,问n经过k次操作之后留下的n的期望,每次操作n随机变成一个n的因数 题解 概率dp计算 ...

随机推荐

  1. 【第十周读书笔记】读node入门,一本全面的node.js教程

    我学到了路由的定义,路由就是解析URL然后转到相应的执行程序. 我们要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码(这里“代码”对应整个应用的第三部 ...

  2. Dubbo执行流程?

    Dubbo执行流程? 0 start: 启动Spring容器时,自动启动Dubbo的Provider 1.register: Dubbo的Provider在启动后自动会去注册中心注册内容.注册的内容包 ...

  3. mfc中的_T

    mfc 中的字符串表示常用_T,意为text,定义为宏定义,可以方便的定义所有字符串为UNICODE(16位,长字符)或者ANSI(8位,短字符). 如果对于所有的字符串定义了_T并且定义了预处理标志 ...

  4. [JZOJ6359] 【NOIP2019模拟2019.9.15】小ω的树

    题目 题目大意 给你一棵树,带点权和边权. 要你选择一个联通子图,使得点权和乘最小边权最大. 支持修改点权操作. 思考历程 显然,最先想到的当然是重构树了-- 重构树就是在做最大生成树的时候,当两个联 ...

  5. Servlet - request对象相关

    request对象中封装了当前请求的所有请求信息, request对象由Tomcat服务器创建, 并作为实参传递给处理请求的Servlet的service()方法 1. 获取请求头数据 // 获取请求 ...

  6. Element-UI 的树列表实现单选

    1. Element-UI 的 el-tree 组件当设置了 show-checkbox 属性以后,默认是只能多选的,如果我们想要将其改选为单选,就要进行一些特殊的处理,首先看效果图. 2. 组件代码 ...

  7. 优化剪枝搜索——牛客多校第二场F

    试了很多种爆搜和剪枝,最后发现还是状压的比较好用 #include <bits/stdc++.h> using namespace std; // #define IO #define f ...

  8. 牛客多校第八场 C CDMA 线性代数:沃尔什矩阵

    题意: 构造出一个由1和-1组成的$2^k*2^k$的矩阵,使得矩阵任意两列内积为0 题解: 数学知识,沃尔什矩阵.沃尔什矩阵的特性被CDMA(码分多址)采用,使得编码成为无线信号的频段和振幅之外的第 ...

  9. 扩展BSGS-传送门

    很好的讲解:ZigZagK 好的讲解:mjtcn 某个模板:here 模板题: BSGS:ZigZagK的poj2417 exBSGS:ZigZagK的poj3243 — AC_Gibson 一般的板 ...

  10. 数据结构C++版-树

    一.概念 树是节点的有限集合. 二叉树: 二.补充知识点 1.<二叉树编码实战二>课程笔记: 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 迭代:利用变量的原值推算 ...