解析:初看本题,便知用动态规划,但我认为首要难点就是求出每道题的错误率,这就需要读懂题意,即分数取模;
举个例子:
1.当正确率为0.5时通过取模计算,正确率为5e8+4,因为此时的正确率和错误率相等,所以错误率也为5e8+4;
2.当正确率为1/3时,正确率为(1e9+8)/3,所以错误率为2*(1e9+8)/3;
。
。
所以我们得出结论,错误率和正确率之和为1e9+8;
于是就可解出本题
代码如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll n,r[2020],e[2020];
ll dp[2020][2020];//dp[i][j]的意思是,前i到题做对j道题的概率
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>r[i];
e[i]=(1+mod-r[i]);
}
dp[1][0]=e[1];
dp[1][1]=r[1];
for(int i=2;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
dp[i][j]=dp[i-1][j]*e[i]%mod;//前i-1道题已有j题正确此题错误
if(j!=0)
{
dp[i][j]=(dp[i][j]+dp[i-1][j-1]*r[i]%mod)%mod;//前i-1道题已有j-1题正确此题正确并与前者相加
}
}
}
for(int i=0;i<=n;i++)
{
cout<<dp[n][i]<<" ";
}
return 0;
}