zoukankan      html  css  js  c++  java
  • hdu 4050(概率dp)

    算是挺简单的一道概率dp了,如果做了前面的聪聪于可可的话,这题不需要什么预处理,直接概率dp就行了。。。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <algorithm>
    #include <math.h>
    #include <map>
    #include <queue>
    #include <sstream>
    #include <iostream>
    using namespace std;
    #define INF 0x3fffffff
    #define N 2020
    
    double p[N][5];
    int n,a,b;
    double dp[N][5];
    
    void dfs(int s,int k)
    {
        if(dp[s][k]>=0) return ;
        double tmp=0;
        if(k==1)
        {
            double tp=1;
            for(int i=s+a;i<=s+b;i++)
            {
                if(i>n) //超出了界限
                {
                    tmp+=tp;
                    break;
                }
                dfs(i,2);
                tmp += tp*p[i][2]*(dp[i][2]+1); //选2的时候的概率
                dfs(i,3);
                tmp += tp*p[i][3]*(dp[i][3]+1);
                tp*=(1-p[i][2]-p[i][3]);
            }
            dp[s][k]=tmp;
        }
        else
        {
            if(k==2)
            {
                double tp=1;
                for(int i=s+a;i<=s+b;i++)
                {
                    if(i>n) //超出了界限
                    {
                        tmp+=tp;
                        break;
                    }
                    dfs(i,1);
                    tmp+=tp*p[i][1]*(dp[i][1]+1);
                    dfs(i,3);
                    tmp+=tp*p[i][3]*(dp[i][3]+1);
                    tp*=(1-p[i][1]-p[i][3]);
                }
                dp[s][k]=tmp;
            }
            else
            {
                double tp=1;
                for(int i=s+a;i<=s+b;i++)
                {
                    if(i>n) //超出了界限,
                    {
                        tmp+=tp;
                        break;
                    }
                    dfs(i,1);
                    tmp+= tp*p[i][1]*(dp[i][1]+1);
                    dfs(i,2);
                    tmp+=tp*p[i][2]*(dp[i][2]+1);
                    dfs(i,3);
                    tmp+=tp*p[i][3]*(dp[i][3]+1);
                    tp*=p[i][0];
                }
                dp[s][k]=tmp;
            }
        }
    }
    
    int main()
    {
        //freopen("//home//chen//Desktop//ACM//in.text","r",stdin);
        //freopen("//home//chen//Desktop//ACM//out.text","w",stdout);
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d%d",&n,&a,&b);
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<=3;j++)
                    scanf("%lf",&p[i][j]);
            }
            for(int i=0;i<=n;i++)
                for(int j=0;j<=3;j++)
                    dp[i][j]=-1;
            dfs(0,3);
            printf("%.6lf
    ",dp[0][3]);
        }
        return 0;
    }
  • 相关阅读:
    leetcode_239. 滑动窗口最大值
    pagehelper分页 配置参数 supportMethodsArguments 建议不要全局设置
    java面经收集
    HTTP协议超级详解
    MySQL数据库用户常用权限命令
    MySQL数据库的隔离级别
    InnoDB存储引擎的事务
    MySQL系统函数
    MySQL数据库备份与恢复
    MySQL数据库常见的数据类型
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/3245705.html
Copyright © 2011-2022 走看看