leetcode 5090 Toss Strange Coins

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];
    }
};
发布了44 篇原创文章 · 获赞 0 · 访问量 977

猜你喜欢

转载自blog.csdn.net/weixin_37748689/article/details/102662639