https://leetcode-cn.com/problems/toss-strange-coins/
概率dp。每个硬币有正面和反面两种可能。用 dp[i][j] 表示前 i 个硬币有 j 个正面的概率。转移方程为:
dp[i][j] = dp[i - 1][j] * (1 - p[i]);
dp[i][j + 1] = dp[i - 1][j] * p[i];
最后的结果就是dp[n][target]。
class Solution {
public:
double probabilityOfHeads(vector<double>& p, int target) {
/*
概率dp。每个点有正面和反面两种可能
dp[i][j]表示前i枚硬币,j次正面向上的概率
dp[i][j] = dp[i - 1][j] * (1 - p[i]); // 第i次向下
dp[i][j + 1] = dp[i - 1][j] * p[i];
return dp[n - 1][target]
*/
int n = p.size();
vector<vector<double>> dp(1010, vector<double>(1010, 0.0));
dp[0][0] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < n; j++)
{
dp[i][j] += dp[i - 1][j] * (1.0 - p[i - 1]);
dp[i][j + 1] += dp[i - 1][j] * p[i - 1];
}
}
return dp[n][target];
}
};