zoukankan      html  css  js  c++  java
  • [Swift]LeetCode1155. 掷骰子的N种方法 | Number of Dice Rolls With Target Sum

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(www.zengqiang.org
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/11333871.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    You have d dice, and each die has f faces numbered 1, 2, ..., f.

    Return the number of possible ways (out of fd total ways) modulo 10^9 + 7 to roll the dice so the sum of the face up numbers equals target.

    Example 1:

    Input: d = 1, f = 6, target = 3
    Output: 1
    

    Example 2:

    Input: d = 2, f = 6, target = 7
    Output: 6
    

    Example 3:

    Input: d = 2, f = 5, target = 10
    Output: 1
    

    Example 4:

    Input: d = 1, f = 2, target = 3
    Output: 0
    

    Example 5:

    Input: d = 30, f = 30, target = 500
    Output: 222616187 

    Constraints:

    • 1 <= d, f <= 30
    • 1 <= target <= 1000

    这里有 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

    108ms
     1 class Solution {
     2     
     3     var dp = [[Int]]()
     4     
     5     func numRollsToTarget(_ d: Int, _ f: Int, _ target: Int) -> Int {
     6         // var result = 0
     7         // dp = Array(repeating: Array(repeating: -1, count: target + 1), count: d + 1)
     8         // return rollsHelper(d, f, target)
     9         
    10         var newDP = Array(repeating: 0, count: target + 1)
    11         newDP[0] = 1
    12         for i in 0..<d {
    13             var newDP1 = Array(repeating: 0, count: target + 1)
    14             for j in 1...f {
    15                 if j > target {
    16                     continue
    17                 }
    18                 for k in j...target {
    19                     newDP1[k] = (newDP1[k] + newDP[k - j]) % 1000000007
    20                 }
    21             }
    22             newDP = newDP1
    23         }
    24         //print(newDP)
    25         return newDP[target]
    26     }
    27     
    28     func rollsHelper(_ d: Int, _ f: Int, _ target: Int) -> Int {
    29         
    30         if (d == 0 || target <= 0) { 
    31             return d == target ? 1 : 0
    32         }
    33         
    34         if dp[d][target] != -1 {
    35             return (dp[d][target] - 1)
    36         }
    37         
    38         var result = 0
    39         for i in 1...f {
    40             result = result + rollsHelper(d - 1, f, target - i) % 1000000007
    41         }
    42         
    43         dp[d][target] = (result + 1) 
    44         return result % 1000000007
    45     }
    46 }

    120ms

     1 class Solution {
     2     func numRollsToTarget(_ d: Int, _ f: Int, _ target: Int) -> Int {     
     3         var dp = [[Int]](repeating: [Int](repeating: 0, count: max(target+1, f+1)), count: d)
     4         for i in 0..<f { dp[0][i+1] = 1 }
     5         for i in 1..<d {
     6             for j in 1..<target {               
     7                 for k in 0..<f{ 
     8                     if dp[i-1][j] > 0 {
     9                         let cur = j + k + 1
    10                         if cur <= target {
    11                             dp[i][cur] = (dp[i][cur] + dp[i-1][j])%(1000_000_007)
    12                         }
    13                     } else {
    14                         break
    15                     }
    16                 }
    17             }
    18         }
    19         return dp[d-1][target]
    20     }
    21 }

    140ms

     1 class Solution {
     2     func numRollsToTarget(_ d: Int, _ f: Int, _ target: Int) -> Int {     
     3         var len = max(target+1, f+1)
     4         var dp = [[Int]](repeating: [Int](repeating: 0, count: len), count: d)
     5         for i in 0..<f { dp[0][i+1] = 1 }
     6         for i in 1..<d {
     7             for j in 1..<target {               
     8                 for k in 0..<f{ 
     9                     if dp[i-1][j] > 0 {
    10                         let cur = j + k + 1
    11                         if cur <= target {
    12                             dp[i][cur] = (dp[i][cur] + dp[i-1][j])%(1000_000_007)
    13                         }
    14                     } else {
    15                         break
    16                     }
    17                 }
    18             }
    19         }
    20         return dp[d-1][target]
    21     }
    22 }

    Runtime: 144 ms

    Memory Usage: 21.1 MB
     1 class Solution {
     2     func numRollsToTarget(_ d: Int, _ f: Int, _ target: Int) -> Int {
     3         var dp:[Int] = [Int](repeating:0,count:target + 1)
     4         dp[0] = 1
     5         for c in 0..<d
     6         {
     7             for i in stride(from:target,through:0,by:-1)
     8             {
     9                 dp[i] = 0
    10                 var x:Int = 1
    11                 while(x <= f && x <= i)
    12                 {
    13                     dp[i] = (dp[i] + dp[i - x]) % 1000000007
    14                     x += 1
    15                 }
    16             }
    17         }
    18         return dp[target]
    19     }
    20 }

    168ms
     1 class Solution {
     2     
     3     var dp = [[Int]]()
     4     
     5     func numRollsToTarget(_ d: Int, _ f: Int, _ target: Int) -> Int {
     6         var result = 0
     7         dp = Array(repeating: Array(repeating: -1, count: target + 1), count: d + 1)
     8         return rollsHelper(d, f, target)
     9     }
    10     
    11     func rollsHelper(_ d: Int, _ f: Int, _ target: Int) -> Int {
    12         
    13         if (d == 0 || target <= 0) { 
    14             return d == target ? 1 : 0
    15         }
    16         
    17         if dp[d][target] != -1 {
    18             return (dp[d][target] - 1)
    19         }
    20         
    21         var result = 0
    22         for i in 1...f {
    23             result = result + rollsHelper(d - 1, f, target - i) % 1000000007
    24         }
    25         
    26         dp[d][target] = (result + 1) 
    27         return result % 1000000007
    28     }
    29 }

    176ms

     1 class Solution {
     2     func numRollsToTarget(_ d: Int, _ f: Int, _ target: Int) -> Int {
     3         var dp = [Int](repeating: 0, count: target + 1)
     4         dp[0] = 1
     5         for i in 1...d {
     6             var dp1 = [Int](repeating: 0, count: target + 1)
     7             for j in 1...f {
     8                 for k in stride(from: max(i, j), through: min(target, i * f), by: 1) {
     9                     dp1[k] = (dp1[k] + dp[k-j]) % 1_000_000_007
    10                 }
    11             }
    12             dp = dp1
    13         }
    14         return dp[target]
    15     }
    16 }
  • 相关阅读:
    作业2019.1.15
    面向对象
    Arrays类的常用方法
    堆和栈的区别
    吃货联盟订餐系统
    解决Navicat连接MySQL出现1251-Client does not support authentication protocol requested by server;
    k-进制数
    怎么用宝塔面板搭建一个网站?
    Win10启动修复无法修复你的电脑解决方法
    java HashMap怎么用
  • 原文地址:https://www.cnblogs.com/strengthen/p/11333871.html
Copyright © 2011-2022 走看看