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