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

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. python--模块导入与执行

    定义:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 一.模块注意: 1.所有的模块都应该自觉的往上写 2.调用模块的时候都是最先在本地找 3.写模块的顺序是 ...

  2. jdk源码阅读-ConcurrentLinkedQueue(一)

    说明 concurrentLinkedQueue为无界非阻塞队列,是线程安全的 内部结构为链表的形式, 内部使用cas保存线程安全.采用cas保证原子性 什么是CAS CAS 操作包含三个操作数 —— ...

  3. 28. string类中方法练习

    1. 自己写trim方法 public class Demo3 { public static void main(String[] args) { System.out.println(myTrim ...

  4. Kotlin Download

    { https://github.com/JetBrains/kotlin/releases/tag/v1.3.50 }

  5. Tomcat 调优的技巧

    转载:www.cnblogs.com/wangsen, https://mp.weixin.qq.com/s/WrIsOOyR7o4SwSXMT0Zecg 最近,看到一篇讲述 Tomcat 调优的文章 ...

  6. 云cassandra 重磅发布dynamodb特性

    云cassandra全新发布dynamodb特性 nosql主力数据库再上新台阶 9月阿里云cassandra产品发布,具体参考阿里云全球首发云Cassandra服务.迄今为止,已有上百大B客户开通了 ...

  7. NX二次开发-调系统命令UF_load_library[UFUN调DLL]

    此函数可以调DLL,可以调宏,当然也可以调其他内部函数(知道哪个内部函数怎么用的前提下). #include <uf.h> void UFUN_API_Call_DLL(char* dll ...

  8. linux centos 安装配置varnish

    安装2.0+版本 前期准备: 下载pcre http://sourceforge.net/projects/pcre/files/pcre/ http://optimate.dl.sourceforg ...

  9. 从yjz那里偷来的fread读入挂

    struct fastio{ char s[100005]; int it,len; fastio(){it=len=0;} inline char get(){ if(it<len)retur ...

  10. PAT_A1102#Invert a Binary Tree

    Source: PAT A1102 Invert a Binary Tree (25 分) Description: The following is from Max Howell @twitter ...