POJ 2151 Check the difficulty of problems(概率DP)
題意:ACM比賽中, 有T個隊, m道題, 每個隊能解出每道題的概率已知, 求每個隊至少解出一道題並且冠軍隊解出至少n道題的概率。
思路:首先, 我們不難想到用d[i][j]表示前i個隊, 冠軍隊解出了j道題的概率。 那麼答案就是sum(a[n][j]) j >= n 。 每次轉移的代價是, 決策第i個隊解決了多少道題, 並且更新j(冠軍隊的解題數)。 那麼難點就在於怎麼求出第i個隊解出j個題的概率。 我們再求一次DP, 用x[i][j][k]表示,第i個隊在前j個題中解出了k個題的概率。 那麼轉移就是x[i][j][k] = x[i][j-1][k-1] * a[i][j] + x[i][j-1][k] * a[i][j]。 邊界條件是:
1. x[0][0][0] = 1,表示前0個隊解出0題, 這是顯然的。
2. 還有一個就是x[i][j][0] = (1-a[i][1]) * (1-a[i][2]) * ...... * (1 - a[i][j])。
細節參見代碼:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include