请选择 进入手机版 | 继续访问电脑版

leetcode1155_go_掷骰子的N种方法

[复制链接]

2821

主题

2821

帖子

8465

积分

论坛元老

Rank: 8Rank: 8

积分
8465
发表于 2021-6-8 12:07:42 | 显示全部楼层 |阅读模式
清纯幸运飞艇玩法技巧校花

这里有 d 个一样的骰子,每个骰子上都有 f 个面,南非世界杯决赛比分标号为 1, 2, ..., f。

我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。

如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所有的组合情况总共有 f^d 种),

模 10^9 + 7 后返回。

示例 1:输入:d = 1, f = 6, target = 3 输出:1

示例 2:输入:d = 2, f = 6, target = 7 输出:6

示例 3:输入:d = 2, f = 5, target = 10 输出:1

示例 4:输入:d = 1, f = 2, target = 3 输出:0

示例 5:输入:d = 30, f = 30, target = 500 输出:222616187

提示:1 <= d, f <= 30

1 <= target <= 1000
解题思路分析

1、动态规划;时间复杂度O(n^3),空间复杂度O(n)



func numRollsToTarget(d int, f int, target int) int {        dp := make([]int, target+1)        dp[0] = 1        for i := 0; i < d; i++ {                next := make([]int, target+1)                for j := 1; j <= f; j++ {                        for k := 0; k <= target-j; k++ {                                next[k+j] = (next[k+j] + dp[k]) % 1000000007                        }                }                dp = next        }        return dp[target]}
2、动态规划;时间复杂度O(n^3),空间复杂度O(n^2)
func numRollsToTarget(d int, f int, target int) int {        dp := make([][]int, d+1)        for i := 0; i <= d; i++ {                dp = make([]int, target+1)        }        dp[0][0] = 1        for i := 1; i <= d; i++ {                for j := i; j <= target; j++ {                        for k := 1; k <= f; k++ {                                if j >= k {                                        dp[j] = (dp[j] + dp[i-1][j-k]) % 1000000007                                }                        }                }        }        return dp[d][target]}综合大赢家足球即时比分

Medium清纯幸运飞艇玩法技巧校花,动态规划题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


快速回复 返回顶部 返回列表