Codeforces Round #253 (Div. 2) D题

题目大意是选出一个其他不选,问问最大概率;

刚开始想到DP:F[I][J][0]:表示从 前I个中选出J个的最大值,

然后对于F[I][J][1]=MAX(F[I-1][J][1],F[I-1][J-1][0]*A[I]+F[I-1][J-1][1]*(1-A[I]));

但是这是错误的因为F[I-1][J-1][0]和F[I-1][J-1][1]不一定对应相同的数。//我错了,可以DP

先来公式:

            

    double temp=f[i-1][j-1][0]*p[i]+f[i-1][j-1][1]*(1-p[i]);
    if (temp<f[i-1][j][1]) {f[i][j][1]=f[i-1][j][1];f[i][j][0]=f[i-1][j][0];}
    else f[i][j][1]=temp,f[i][j][0]=f[i-1][j-1][0]*(1-p[i]);

     当f[I][J][0] 随着F[I][J][1]变化时就可以满足,

    因为我们求的是F[I][J][1]的最大值。 注意我们F[I][J][1]和F[I][J][0]所选的数应该是一致的,所以当F[I][J][1]满足最大时,F[I][J][0]只需要跟着变化就可以了。

   

暴力做法:

先排序;

假如从1个中选,就选最大,

假如从2个中选,就在A[1],A[2](排好序了)中选 

证明:http://codeforces.com/blog/entry/12739

CF上的题解

大概是:证明在这组中加一个数,那到底解概率大的好还是概率小的更优,

           结论证明是先加大的情况更优。

           证明着实是搞数学竞赛的人才能想出来 

原文地址:https://www.cnblogs.com/forgot93/p/3801531.html