牛客练习赛26 烟花(概率DP)

版权声明:转就转吧~~记得声明噢~~ https://blog.csdn.net/Soul_97/article/details/82529447

传送

概率DP

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 100 + 5;
const int mod = 1e9 + 7;
const int MAXN=1E5+10;
const int MAXK=101;
 
int n,k;
double f[MAXN][MAXK],p[MAXN];
 
int main()
{
    scanf("%d%d",&n,&k);
    double Ans=0;
    for(int i=1;i<=n;i++)  scanf("%lf",&p[i]),Ans+=p[i];
    f[0][0]=1;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=k;j++)
            f[i][j]=f[i-1][j]*(1-p[i])+(j?(f[i-1][j-1]*p[i]):0);
    printf("%.4lf\n%.4lf\n",Ans,f[n][k]);
}

优化版

#include <bits/stdc++.h>
using namespace std;
 
double f[110];
double cnt;
int main()
{
    int n, k;
    scanf("%d%d", &n, &k);
    f[0] = 1;
    for (int i = 1; i <= n; i++)
    {
        double p;
        scanf("%lf", &p);
        cnt += p;
        for (int j = k; j >= 1; j--)
            f[j] = f[j] * (1 - p) + f[j - 1] * p;
        f[0] *= (1 - p);
    }
    printf("%.4f\n", cnt);
    printf("%.4f\n", f[k]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Soul_97/article/details/82529447
今日推荐