zoukankan      html  css  js  c++  java
  • POJ 2151 Check the difficulty of problems (动态规划-可能DP)

    Check the difficulty of problems
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 4522   Accepted: 1993

    Description

    Organizing a programming contest is not an easy job. To avoid making the problems too difficult, the organizer usually expect the contest result satisfy the following two terms: 
    1. All of the teams solve at least one problem. 
    2. The champion (One of those teams that solve the most problems) solves at least a certain number of problems. 

    Now the organizer has studied out the contest problems, and through the result of preliminary contest, the organizer can estimate the probability that a certain team can successfully solve a certain problem. 

    Given the number of contest problems M, the number of teams T, and the number of problems N that the organizer expect the champion solve at least. We also assume that team i solves problem j with the probability Pij (1 <= i <= T, 1<= j <= M). Well, can you calculate the probability that all of the teams solve at least one problem, and at the same time the champion team solves at least N problems?

     

    Input

    The input consists of several test cases. The first line of each test case contains three integers M (0 < M <= 30), T (1 < T <= 1000) and N (0 < N <= M). Each of the following T lines contains M floating-point numbers in the range of [0,1]. In these T lines, the j-th number in the i-th line is just Pij. A test case of M = T = N = 0 indicates the end of input, and should not be processed.

    Output

    For each test case, please output the answer in a separate line. The result should be rounded to three digits after the decimal point.

    Sample Input

    2 2 2
    0.9 0.9
    1 0.9
    0 0 0
    

    Sample Output

    0.972

    Source

    POJ Monthly,鲁小石

    题目大意:

    有 M 道题目 T 支队伍。N表示 最好 的队 至少要做出N题 ,紧接下来T行M列,表示某队做出某题 的概率为p ,问你每支队至少做出1题,最好的队至少做出N题的概率是多少?


    解题思路:

    一题动态规划的题。 既然最好的队至少做出N题。那么用二维记录,DP [t][f]  记录还剩 t 支队及是否出现超过N题的事件的概率。假设当前这支队伍做出超过N题,那么f置为1,否则还是f。弹了两遍,第一遍由于忘记算做出0题的情况,第二遍由于递归中数组开得略大些超内存了。


    解题代码:

     

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    
    const int maxt=1100;
    const int maxn=32;
    double dp[maxt][2];
    double p[maxt][maxn];
    
    
    int T,M,N;
    
    
    double DP(int t,int f){
        if(t<=0) return f;
        if(dp[t][f]>-1.0) return dp[t][f];
    
    
        double a[maxn][maxn],ans=0;
        a[0][0]=1;
        for(int i=1;i<=M;i++){
            for(int j=0;j<=i;j++){
                a[i][j]=0;
                if(j-1>=0) a[i][j]+=a[i-1][j-1]*p[t][i];
                if(i-1>=j) a[i][j]+=a[i-1][j]*(1-p[t][i]);
            }
        }
        for(int i=1;i<N;i++) ans+=DP(t-1,f)*a[M][i];
        for(int i=N;i<=M;i++) ans+=DP(t-1,1)*a[M][i];
    
    
        return dp[t][f]=ans;
    }
    
    
    void input(){
        for(int i=1;i<=T;i++){
            dp[i][0]=dp[i][1]=-2.0;
            for(int j=1;j<=M;j++){
                scanf("%lf",&p[i][j]);
            }
        }
    }
    
    
    void solve(){
        printf("%.3f
    ",DP(T,0));
    }
    
    
    int main(){
        while(scanf("%d%d%d",&M,&T,&N)!=EOF && (T||M||N) ){
            input();
            solve();
        }
        return 0;
    }
    



    版权声明:这篇文章的博客toyking原创文章。博客,未经同意不得转载。

  • 相关阅读:
    interface——关于虚函数的内存分配
    [asp.net]网页与服务器的交互模型
    C#下把txt文件数据读进sql server中存储所遇到的乱码问题
    安装window 7 续 ~~~
    ASP.NET中对SQLITE数据库进行插入操作后返回自增的ID
    非IE浏览器下让界面变灰色
    ASPNET目录权限控制
    自己封装的Access数据库的操作类(AccessHelper)
    用WIN7发现的问题(AppHangB1)
    [原创视频]牛腩新闻发布系统(续)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4946922.html
Copyright © 2011-2022 走看看