hdu 4089 不错的DP 北京现场赛题

http://acm.hdu.edu.cn/showproblem.php?pid=4089

还有疑惑,需要重新推:

但是学到的:

1、A=a+b+c  abc是三种情况,那么P(A)=a*P(a->事件)+b*P(b->事件)+c*P(c->事件);

a->事件意思是 在a情况下的事件,就是全概率公式的思想吧

2、一定注意每一步会不会出现分母为0 的情况,以及预处理的时候对于一些特殊情况导致自己的式子会出现分母为0的排除掉

3、概率DP经常出现推出了式子但是自己不会写代码的情况,那么就模拟计算,注意迭代找计算规律

题解参考着两个:

http://blog.csdn.net/morgan_xww/article/details/6920236

http://88094657.blog.163.com/blog/static/147251759201222781153704/

至于第一篇博客提到的TLE的事情,目测是分母出现0了,其实算法挺多的,不一定用那个:

可以这样:(因为dp[i][i]和dp[i][1] c[j]已经算出来了)

            for(int j=2;j<i;j++)
            {
                dp[i][j]=p21*dp[i][j-1]+c[j];
            }

但是不知道为啥这个不对。。

            for(int j=2;j<i;j++)
            {
                dp[i][j]=p21*dp[i][i] + p31*dp[i-1][j-1];
                if(j<=k) dp[i][j]+=p41;
            }

AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;

#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)

const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const int MAXN = 2000+5;
double dp[MAXN][MAXN],pp[MAXN];
double c[MAXN];

int main()
{
    //IN("hdu4089.txt");
    int n,m,k;
    double p1,p2,p3,p4,p21,p31,p41;
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        CL(dp,0);
        scanf("%lf%lf%lf%lf",&p1,&p2,&p3,&p4);
        if(abs(1.0-p1-p2)<EPS || abs(p4)<EPS)
        {
            puts("0.00000");
            continue;
        }
        dp[1][1]=p4/(1.0-p1-p2);
        p21=p2/(1.0-p1);
        p31=p3/(1.0-p1);
        p41=p4/(1.0-p1);
        c[1]=p41;c[0]=1.0;///

        pp[0]=1.0;
        for(int i=1;i<=n;i++)
            pp[i]=p21*pp[i-1];
        for(int i=2;i<=n;i++)
        {
            for(int j=2;j<=k;j++)
                c[j]=p31*dp[i-1][j-1]+p41;
            for(int j=k+1;j<=n;j++)
                c[j]=p31*dp[i-1][j-1];
            double tmp=0.0;
            for(int j=1;j<=i;j++)
                tmp+=pp[i-j]*c[j];
            dp[i][i]=tmp/(1.0-pp[i]);
            dp[i][1]=p21*dp[i][i]+p41;

            /*for(int j=2;j<i;j++)
            {
                dp[i][j]=p21*dp[i][i] + p31*dp[i-1][j-1];
                if(j<=k) dp[i][j]+=p41;
            }*/

            for(int j=2;j<i;j++)
                dp[i][j]=p21*dp[i][j-1]+c[j];
        }
        printf("%.5lf\n", dp[n][m]);
    }
    return 0;
}

hdu 4089 不错的DP 北京现场赛题

时间: 2024-10-02 17:28:03

hdu 4089 不错的DP 北京现场赛题的相关文章

HDUOJ-------2493Timer(数学 2008北京现场赛H题)

Timer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 445    Accepted Submission(s): 90 Problem Description Recently, some archaeologists discovered an ancient relic on a small island in the Pa

HDUOJ--------A simple stone game(尼姆博弈扩展)(2008北京现场赛A题)

A simple stone game                                                                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)                                             

hdu 4779 Tower Defense 2013杭州现场赛

1 /** 2 题意: 有两种塔,重塔,轻塔.每种塔,能攻击他所在的一行和他所在的一列, 轻塔不 能被攻击,而重塔可以被至多一个塔攻击,也就是说重塔只能被重塔攻击.在一个n*m 的矩阵中,最少放一个塔,可放多个 3 问,给定p个重塔,q个轻塔,问有多少种放法.. 4 5 思路: 1. 一行中有两个重塔, 6 2. 一列中有两个重塔 7 3. 在该行及在该行塔所在的列只有一个塔,重塔或者轻塔. 8 对以上三种情况 9 挨个处理: 10 1. 设有i行有两个重塔,j列有两个重塔,则一共占 i+2*j

Go Deeper(2010成都现场赛题)(2-sat)

G - Go Deeper Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Here is a procedure's pseudocode: go(int dep, int n, int m) begin output the value of dep. if dep < m and x[a[dep]] + x[b[dep]] != c[dep] then go(dep +

Error Curves(2010成都现场赛题)

F - Error Curves Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a method called Linear Discriminant Analysis, which h

hdu 5074 DP 2014鞍山现场赛题

hdu 5074 http://acm.hdu.edu.cn/showproblem.php?pid=5074 挺水的DP,注意依a[i-1]和a[i]的正负区分状态转移,然后O(n^3)即可轻易解决,我DP挺弱的也能过,貌似也就CF C题水平 //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <algo

HDU 4089 Activation (概率dp 好题 + 难题)

Activation Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1842    Accepted Submission(s): 689 Problem Description After 4 years' waiting, the game "Chinese Paladin 5" finally comes out.

hdu 5538 House Building(长春现场赛——水题)

题目链接:acm.hdu.edu.cn/showproblem.php?pid=5538 House Building Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 621    Accepted Submission(s): 398 Problem Description Have you ever played the vid

HDU 5045 状压DP 上海网赛

比赛的时候想的是把n个n个的题目进行状压 但这样不能讲究顺序,当时精神面貌也不好,真是挫死了 其实此题的另一个角度就是一个n个数的排列,如果我对n个人进行状压,外面套一个按题目循序渐进的大循环,那么,在当前做第i个题目,前i-1个题目已经做完,然后做完的人的状态为j, j可能是1110 1101 1011什么的(假设已经做了三道题),因为我这样就可以只管状态而不管顺序了,我只取这种状态下的最大值,他究竟是怎么个顺序排列我不用管 到此...好像问题就没有什么问题了,这种做法重复 m/n次最后把剩余