1. 程式人生 > 實用技巧 >劍指 Offer 60. n個骰子的點數 - 動態規劃

劍指 Offer 60. n個骰子的點數 - 動態規劃

把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; } }