https://ac.nowcoder.com/acm/problem/18200
分析:
double x = 1.0000 - arr[i];
double y = arr[i];
dp[i][j] = p(上次没炸) + p(上次炸了)
注意不能超过k次
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
const int maxn = 1e5+5;
double dp[maxn][205];
double arr[maxn];
int main()
{
int n, k;
cin >> n >> k;
double exp = 0;
rep(i,1,n)
{
cin >> arr[i];
exp += arr[i];
}
dp[0][0] = 1;
rep(i,1,n)
{
double x = 1.0000 - arr[i];
double y = arr[i];
rep(j,0,min(i,k)){
dp[i][j] = dp[i-1][j]*x + dp[i-1][j-1]*y;
}
}
printf("%.4lf\n", exp);
printf("%.4lf", dp[n][k]);
return 0;
}
思路:
https://zhuanlan.zhihu.com/p/75320558