题目大意是选出一个其他不选,问问最大概率;
刚开始想到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上的题解
大概是:证明在这组中加一个数,那到底解概率大的好还是概率小的更优,
结论证明是先加大的情况更优。
证明着实是搞数学竞赛的人才能想出来