POJ 2096 【期望DP】

题意:

有n种选择,每种选择对应m种状态。每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等。

求n种选择和m种状态中每种至少发生一次的期望。

期望DP好别扭啊。要用倒推的方法。

dp[i][j]表示已经发生了i种选择,j种状态。

那么由dp[n][m]这个时刻到最终时刻的期望是0.

而我们的起始时刻是dp[0][0]。

而dp[i][j]可以转移到四种情况,

1 dp[i][j]本身

2 dp[i+1][j]

3 dp[i][j+1]

4 dp[i+1][j+1]

那么dp[i][j]表示的期望是他能够转移到别的所有的情况的期望乘其权值的和。

好的。这大概就是期望DP的精髓了...

#include<stdio.h>
#include<string.h>
double dp[1005][1005];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    memset(dp,0,sizeof(dp));
    for(int i=n;i>=0;i--)
    {
        for(int j=m;j>=0;j--)
        {
            if(i!=n||j!=m)
            dp[i][j]=(dp[i][j+1]*(m-j)*i/((double)(m*n))+dp[i+1][j]*(n-i)*j/((double)(m*n))+dp[i+1][j+1]*(n-i)*(m-j)/((double)(m*n))+1)/((double)(1-((double)(i*j))/(m*n)));
        }
    }
    printf("%.4lf\n",dp[0][0]);
}
时间: 2024-10-07 00:20:24

POJ 2096 【期望DP】的相关文章

poj 2096 (概率DP)

http://poj.org/problem?id=2096 概率DP: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 double dp[1003][1003]; 5 int main() 6 { 7 int n,s,i,j; 8 cin>>n>>s; 9 for (i=n;i>=0;i--) 10 { 11 for (j=s;j>=0;j--) 12 { 13

POJ 2096 Collecting Bugs:期望dp

题目链接:http://poj.org/problem?id=2096 题意: 有一个程序猿,他每天都会发现一个bug. bug共有n个种类.属于某一个种类的概率为1/n. 有s个子系统,每个bug属于一个系统.属于某一个系统的概率为1/s. 问你发现的bug能够覆盖到n个种类和s个系统的期望天数. 题解: 期望dp转移的套路: 倒着推. 利用性质:期望 = ∑ (P(子期望)*φ(子期望)) 状态表示: dp[i][j] = expectation i:覆盖到i个种类 j:覆盖到j个系统 dp

[ACM] poj 2096 Collecting Bugs (概率DP,期望)

Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 2026   Accepted: 971 Case Time Limit: 2000MS   Special Judge Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material st

POJ 2096 多系统找n种bug需要的天数期望--期望dp

题意:有s种系统,小明来找bug,他每天能找到且只找到一个bug,要求找齐n种不同的bug,且每个系统中至少要找到一个bug,求完成任务的期望天数 分析: 还是期望dp框架: dp[i][j]:当前状态(找了j种系统,找到i中bug)到达目标状态的期望天数,它能直接到达的状态有这几种: 1.j个系统,i种bug: 2.j个系统,i+1种bug: 3.j+1个系统,i种bug: 4.j+1个系统,i+1种bug 所以方程:dp[i][j]=i/n*j/s*dp[i][j]+(n-i)/n*j/s*

POJ 2096 找bug 期望dp

题目大意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcomponent,问他找到所有的bugs和subcomponents的期望次数. 这道题目要用期望dp来进行统计 假设已经找到i个bug和j个subcomponents,这个状态记为dp[i][j],那么下次查找会出现4种状态:dp[i][j],dp[i+1][j],dp[i][j+1],dp[i+1][j+

poj 3156 hash+记忆化搜索 期望dp

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; #define N 32 #define mod 10007LL #define mod2 10000007 #define inf 0x3fffffff typedef long long ll; typedef double dd; int f[N]

poj 2096 Collecting Bugs (概率dp)

题意:有s个系统,n种bug,一个程序员每天可以发现一个bug,求发现存在s个系统,n种bug的天数的期望 思路:定义dp[i][j]是已经发现i种bug,j个系统的期望 dp[i+1][j+1] 表示在一个新的系统中发现新bug 它的概率为 (n-i)/n*(s-j)/s dp[i+1][j]     表示在一个已经发现过的系统中发现了一种新的bug 概率为 (n-i)/n*j/s dp[i][j+1]     表示在一个新系统中发现一种已经发现过的bug 概率为 i/n*(s-j)/s dp

期望$DP$ 方法总结

期望\(DP\) 方法总结 这个题目太大了,变化也层出不穷,这里只是我的一点心得,不定期更新! 1. 递推式问题 对于无穷进行的操作期望步数问题,一般可用递推式解决. 对于一个问题\(ans[x]\), 我们可以考虑建立逻辑转移: \[ans[now] = Merge(\ \ Function(ans[now])\ ,\ Function(ans[other])\ \ )\] 那么我们进行移项后, \[ans[now]\ Delete\ Function(ans[now])\ \ =\ \ Fu

概率和期望DP

概率和期望DP(整理) 概率DP顺着推,期望DP逆着递推求解 概率,又称或然率.机会率.机率(几率)或可能性,是概率论的基本概念.概率是对随机事件发生的可能性的度量,一般以一个在0到1之间的实数表示一个事件发生的可能性大小.越接近1,该事件更可能发生:越接近0,则该事件更不可能发生.人们常说某人有百分之多少的把握能通过这次考试,某件事发生的可能性是多少,这都是概率的实例. 期望就是加权平均. 1.期望值是指人们对所实现的目标主观上的一种估计: 2.期望值是指人们对自己的行为和努力能否导致所企求之