Atcoder DP Contest pI

Atcoder DP Contest pI

題敘

https://atcoder.jp/contests/dp/tasks/dp_i
有 $n$ 個硬幣,每個硬幣有翻到正面的機率 $p_i$
問正面多於反面的機率有多少

想法

嘗試遮住最後一個硬幣,觀察每次擲硬幣會影響到哪些
定義 $DP[i]$ 表示有 $i$ 個硬幣為正面的機率
則有轉移式 $DP[i] = DP[i-1]*arr[i] + DP[i]*(1-arr[i])$
且已知 $DP[0] = 1$

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//By Koios1143
#include<bits/stdc++.h>
#define LL long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define pii pair<int,int>
using namespace std;
int n;
double now,dp[3005];
int main(){
IOS
while(cin>>n){
dp[0]=1;
for(int i=0 ; i<n ; i++){
cin>>now;
for(int j=i+1 ; j>=0 ; j--){
dp[j] = (j==0 ? 0 : dp[j-1]*now) + dp[j]*(1-now);
}
}
double ans=0;
for(int i=n/2+1 ; i<=n ; i++){
ans+=dp[i];
}
cout<<fixed<<setprecision(10)<<ans<<"\n";
}
return 0;
}

複雜度

有 $n$ 種狀態,每種狀態轉移複雜度約為 $O(n)$
總複雜度 $O(n^2)$

tags: Atcoder DP Contest