808. 分汤【中等】
由于四种分配操作都是25的倍数,因此可以先将n同除以25,四种分配操作变成(4,0),(3,1),(2,2),(1,3),且每种分配概率为0.25。
n较小时,可以用动态规划解决,
动态规划的时间复杂度为O(n2)O(n^2)O(n2),除以25之后依然无法在短时间内得到答案
计算A先分配完的数学期望E(A)=(4+3+2+1)*0.25=2.5,B先分配完的数学期望E(B)=(0+1+2+3)*0.25=1.5,当n非常大时,认为A先被分配完的概率接近于1
动态规划可得这个很大的n的临界值为4475(=179*25),所以n大于这个值时,直接返回概率1
class Solution {public double soupServings(int n) {n=(int)Math.ceil((double)n/25);//ceil天花板取整if(n>179)return 1;double[][] dp=new double[n+1][n+1];dp[0][0]=0.5;for(int i=1;i<=n;i++)dp[0][i]=1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dp[i][j]=(dp[Math.max(0,i-4)][j]+dp[Math.max(0,i-3)][Math.max(0,j-1)]+dp[Math.max(0,i-2)][Math.max(0,j-2)]+dp[Math.max(0,i-1)][Math.max(0,j-3)])/4.0;}}return dp[n][n];}
}
时间复杂度:O(C2)O(C^2)O(C2)
空间复杂度:O(C2)O(C^2)O(C2)
上一篇:百善孝为先下句是什么啊
下一篇:关于打麻将的诗词