LeetCode 808. 分汤 (全概率公式、DP)

分汤
DP方程很容易得到,主要是一个注意点,就是在N很大的是,要求的值非常接近1。
所以无需再求。坑点。。。。

class Solution {
    
    
public:
    int op[4][2] = {
    
    {
    
    100,0},{
    
    75,25},{
    
    50,50},{
    
    25,75}};
    double dp[1010][1010] = {
    
    0};
    double soupServings(int N) {
    
    
        if(N>=1000*25) return 1;
        return solve(N,N);
    }
    double solve(int a,int b){
    
    
        double res = 0;
        if( dp[a/25][b/25] ) return dp[a/25][b/25];
        // 枚举 4 种方案
        for(int k=0;k<4;k++){
    
    
            if(a<=op[k][0] && b<=op[k][1]){
    
    
                // 同时分配完
                res += 0.125;
            }else if(a<=op[k][0]){
    
    
                // a分配完
                res += 0.25;
            }else if(a>op[k][0] && b>op[k][1]){
    
    
                // 子问题
                res += 0.25*solve(a-op[k][0],b-op[k][1]);
            }
        }
        return dp[a/25][b/25] = res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/109007147