[2020牛客寒假算法基础集训营2]C-算概率

咋说呢。这题是我debug数三角形好久之后才看的题目。之后看到题目介绍里的

我就以为每道题的做对做错概率为1/2.这样的话就是求q了。

之后就一直在那边想要怎么做出来这样的题目。之后就到比赛结束都没做出来。

结果看了题解说是DP。我心都凉了。

还是看题目不够仔细。这个问题真的要好好注意一下了。

知道是dp之后就非常简单了。因为这道题的dp并不难构造。

d[i][j] = dp[i-1][j] * p[i] + dp[i-1][j] * (1-p[i])

稍微注意一下取模为负的情况就好了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int mod  = 1e9 + 7;
const int maxn = 2020;

ll dp[maxn][maxn], p[maxn];
int n;

int main(void) {
    cin >> n;
    for(int i = 1; i <= n; i ++) 
        cin >> p[i];
    
    dp[0][0] = 1;
    for(int i = 1; i <= n; i ++)                            
        dp[i][0] = dp[i - 1][0] * (mod + 1 - p[i]) % mod; 
         
    for(int i = 1; i <= n; i ++) 
        for(int j = 1; j <= i; j ++) 
            dp[i][j] =( (dp[i - 1][j - 1] * p[i]) % mod + dp[i - 1][j] * (mod + 1 - p[i]) ) % mod;  
            
    for(int i = 0; i <= n; i ++ ) 
        cout << dp[n][i] << ' ';
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Vikyanite/p/12286264.html
今日推荐