一道dp,比赛场上看出来是一个dp,可是只会暴力,
后来发现转移方程很简单,还是太菜了
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 200;
int n;
double d[N];
double dp[N][N];
double cmp (const double a, const double b) {
return a > b;
}
int main(){
int l;
scanf("%d",&n);
for(int i = 1;i <= n;i ++) {
scanf("%d",&l);
d[i] = 0.01 * l;
}
sort(d + 1, d + n + 1, cmp);
dp[0][0] = 1;
for(int i = 1;i <= n;i ++) {
dp[i][0] = dp[i - 1][0] * (1 - d[i]);
}
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= i;j ++) {
dp[i][j] = dp[i - 1][j - 1] * (d[i]) + dp[i - 1][j] * (1 - d[i ]);
}
}
double res = 0;
for(int i = 1;i <= n;i ++) {
double ans = 0;
for(int j = 1;j <= i;j ++) {
ans += dp[i][j] * pow(j, j * 1.0 / (1.0 * i));
}
res = max(res, ans);
}
printf("%.10lf\n", res);
return 0;
}