每日一道Leetcode -掷骰子系列【可以类比扑克牌|颜色|动态规划|背包问题】

每日一道Leetcode -掷骰子系列【可以类比扑克牌|颜色|动态规划|背包问题】_第1张图片每日一道Leetcode -掷骰子系列【可以类比扑克牌|颜色|动态规划|背包问题】_第2张图片

class Solution:
    def numRollsToTarget(self, d: int, f: int, target: int) -> int:
        # 边界条件 目标值小于所有骰子全投1的情况,或者所有骰子全投f的情况,则返回0,因为投不出来
        if target<d*1 or target>d*f:
            return 0
        # 最大有30颗骰子,投出的总点数为1000
        # row:第几颗骰子 col:m每个骰子投出的点数  
        # dp[row][col]为row个骰子投出点数为col的方法数量
        dp = [[0]*1001 for i in range(31)] 
        # 0颗骰子,目标点数为0的方案只有一种,没得骰/不投
        dp[0][0] = 1
        MOD = 1000000007
        # 投了几个骰子,最少1颗,最多骰了d颗
        for i in range(1,d+1):
            # 前面i颗骰子投出当前点数【有限制条件】
            for j in range(i*1,i*f+1):
                # 要确保前面骰子投出的总和小于目标和
                if j<=target:
                    # 选择当前骰子的可选操作,当前骰子可选操作1~f
                    for k in range(1,f+1):
                        # 确保不会越界
                        if j-k>=0:
                            dp[i][j] = (dp[i][j]+dp[i-1][j-k])%MOD
                        else:
                            break
                else:
                    break
        return dp[d][target]

你可能感兴趣的:(Leetcode,python)