咋说呢。这题是我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; }