码迷,mamicode.com
首页 > 其他好文 > 详细

概率dp入门

时间:2015-04-04 11:52:13      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:

概率DP主要用于求解期望、概率等题目。

转移方程有时候比较灵活。

一般求概率是正推,求期望是逆推。通过题目可以体会到这点。

 poj2096:Collecting Bugs

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
typedef long long ll;
using namespace std;
#define mod 1000000007
double dp[1010][1010];
int n,s;
int main()
{
    while(scanf("%d%d",&n,&s)!=EOF)
    {
        dp[n][s]=0;
        for(int i=n;i>=0;i--)
        {
            for(int j=s;j>=0;j--)
            {
                if(i==n&&j==s) continue;
                dp[i][j]=(n*s+i*(s-j)*dp[i][j+1]+(n-i)*j*dp[i+1][j]+(n-i)*(s-j)*dp[i+1][j+1])/(n*s-i*j);
            }
        }
        printf("%.4f\n",dp[0][0]);
    }
    return 0;
}
//http://www.cnblogs.com/jackge/archive/2013/05/21/3091757.html

 sdut2626题目: The number of steps

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
typedef long long ll;
using namespace std;
#define mod 1000000007
int n;
double dp[110][110];
double a,b,c,d,e;
int main()
{
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        scanf("%lf%lf",&a,&b);
        scanf("%lf%lf%lf",&c,&d,&e);
        memset(dp,0,sizeof(dp));
        dp[n][1]=0;
        for(int i=2;i<=n;i++)
        {
            dp[n][i]=dp[n][i-1]+1;
        }
        for(int i=n-1;i>=1;i--)
        {
            for(int j=1;j<=i;j++)
            {
                if(j==1)
                {
                    if(i==n) continue;
                    dp[i][j]=dp[i+1][j]*a+dp[i+1][j+1]*b+1.0;
                }
                else
                {
                   dp[i][j]=dp[i][j-1]*e+dp[i+1][j]*c+dp[i+1][j+1]*d+1.0;
                }
            }
        }
        printf("%.2lf\n",dp[1][1]);
    }
    return 0;
}

 

概率dp入门

标签:

原文地址:http://www.cnblogs.com/zhangmingcheng/p/4391653.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!