劍指 Offer 60. n個骰子的點數 - 動態規劃
阿新 • • 發佈:2021-01-19
把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,打印出s的所有可能的值出現的概率。 你需要用一個浮點數陣列返回答案,其中第 i 個元素代表這 n 個骰子所能擲出的點數集合中第 i 小的那個的概率。 class Solution { public double[] dicesProbability(int n) { int [][]dp=new int[n+1][6*n+1]; for(int i=1;i<=6;i++){ dp[1][i]=1; } for(int i=2;i<=n;i++){for(int s=i;s<=6*n;s++){ for(int j=1;j<=6;j++){ if(s-j<i-1){//s-j是減去當前點的點數,剩餘的有i-1個點,最小是i-1 break; } //前i個骰子總數為s的次數等於前i-1個骰子等於s-j的次數加上第i個骰子等於j的次數 dp[i][s]+=dp[i-1][s-j];//一個累加過程 dp[3][5]=dp[3][5]+dp[2][4]+dp[2][3]+dp[2][2]} } } //前面計算了n個點得到總數為n-6n的次數,下面計算概率,擲骰子總數是6^n個結果 double total=Math.pow(6,n); double []ans=new double[5*n+1]; for(int i=n;i<=6*n;i++){ ans[i-n]=(double)dp[n][i]/total; } return ans; } }