• JZ074n 个骰子的点数


    n 个骰子的点数

    题目描述

    把 n 个骰子仍在地上,求点数和为 s 的概率。

    题目链接: n 个骰子的点数

    代码

    import java.util.AbstractMap;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 标题:n 个骰子的点数
     * 把 n 个骰子仍在地上,求点数和为 s 的概率。
     */
    public class Jz74 {
    
        /**
         * 动态规划
         * 使用一个二维数组 dp 存储点数出现的次数,其中 dp[i][j] 表示前 i 个骰子产生点数 j 的次数。
         * 空间复杂度:O(N<sup>2</sup>)
         *
         * @param
         * @return
         */
        public List<Map.Entry<Integer, Double>> dicesSum(int n) {
            final int face = 6;
            final int pointNum = face * n;
            long[][] dp = new long[n + 1][pointNum + 1];
    
            for (int i = 1; i <= face; i++)
                dp[1][i] = 1;
    
            for (int i = 2; i <= n; i++)
                for (int j = i; j <= pointNum; j++)     /* 使用 i 个骰子最小点数为 i */
                    for (int k = 1; k <= face && k <= j; k++)
                        dp[i][j] += dp[i - 1][j - k];
    
            final double totalNum = Math.pow(6, n);
            List<Map.Entry<Integer, Double>> ret = new ArrayList<>();
            for (int i = n; i <= pointNum; i++)
                ret.add(new AbstractMap.SimpleEntry<>(i, dp[n][i] / totalNum));
    
            return ret;
        }
    
        /**
         * 动态规划 + 旋转数组
         * 空间复杂度:O(N)
         *
         * @param n
         * @return
         */
        public List<Map.Entry<Integer, Double>> dicesSum2(int n) {
            final int face = 6;
            final int pointNum = face * n;
            long[][] dp = new long[2][pointNum + 1];
    
            for (int i = 1; i <= face; i++)
                dp[0][i] = 1;
    
            int flag = 1;                                     /* 旋转标记 */
            for (int i = 2; i <= n; i++, flag = 1 - flag) {
                for (int j = 0; j <= pointNum; j++)
                    dp[flag][j] = 0;                          /* 旋转数组清零 */
    
                for (int j = i; j <= pointNum; j++)
                    for (int k = 1; k <= face && k <= j; k++)
                        dp[flag][j] += dp[1 - flag][j - k];
            }
    
            final double totalNum = Math.pow(6, n);
            List<Map.Entry<Integer, Double>> ret = new ArrayList<>();
            for (int i = n; i <= pointNum; i++)
                ret.add(new AbstractMap.SimpleEntry<>(i, dp[1 - flag][i] / totalNum));
    
            return ret;
        }
    
        public static void main(String[] args) {
    
        }
    }
    

    【每日寄语】 香九龄,能温席;孝于亲,所当执。

  • 相关阅读:
    静态链接到 MFC 的规则 DLL
    DLLAFX_MANAGE_STATE(AfxGetStaticModuleState())模块状态切换保护
    多线程专题之线程同步(1)
    UVa 4256 Salesmen dp
    nefu 661 Clockwise 水DP+略几何
    10635 Prince and Princess LCS&LIS
    UVa 3882 And Then There Was One 递推无力orz
    UVa 10192 Vacation 字符串dp
    UVa 11584 Partitioning by Palindromes 回文串dp
    UVa 10534 Wavio Sequence LIS
  • 原文地址:https://www.cnblogs.com/kaesar/p/16014828.html
Copyright © 2020-2023  润新知