在Python中,通过避免黑名单步骤计算小球从最低点掉落的方法数量的程序

在Python中,通过避免黑名单步骤计算小球从最低点掉落的方法数量的程序

假设我们有一个值h和一个名为黑名单的数字列表。我们目前位于高度H,并正在玩一款游戏,将一个小球向下移动到高度0。现在,在偶数轮(从0开始),我们可以将球下移1、2或4级楼梯。在奇数轮中,我们可以将球下移1、3或4级楼梯。某些级别被列入黑名单。因此,如果球到达那里,它将立即死亡。我们必须找到小球可以下降到高度0的方式数量。如果答案太大,则将结果模10^9 + 7。

因此,如果输入如下:h = 5 blacklist = [2,1],则输出将是2,因为在第0轮中,首先移动一步(从5到4),然后在下一轮中从4到0。另一种可能的方式是在第0轮中,向下移动两步(从5到3),然后在下一轮中从3到0。

要解决此问题,我们将按照以下步骤进行-.

  • 黑名单:从黑名单元素创建新的集合
  • 如果0在黑名单中或h在黑名单中,则
    • 返回0
  • dp:大小为H的列表,在每个索引处存储对[0,0]的对
  • dp[0]:[1,1]
  • m:10^9 + 7
  • 对于i in range 1 to h,执行以下操作:
    • 对于[1,2,3,4]中的每个x,执行以下操作:
      • 如果i – x是在黑名单中,则
      • 如果x与3不同,则
        • dp [i、0]:= dp [i、0] + dp [i – x、1]
      • 如果x与2不同,则
        • dp [i、1]:= dp [i、1] + dp [i – x、0]
      • dp [i、0]:= dp [i、0] mod m
      • dp [i、1]:= dp [i、1] mod m
  • 返回dp [h、0]

示例

让我们看以下实现以获得更好的理解-。

def solve(h, blacklist):
   blacklist = set(blacklist)
   if 0 in blacklist or h in blacklist:
      return 0
   dp = [[0, 0] for i in range(h + 1)]
   dp[0] = [1, 1]
   m = 10 ** 9 + 7
   for i in range(1, h + 1):
      for x in [1, 2, 3, 4]:
         if i - x >= 0 and i - x not in blacklist:
            if x != 3:
               dp[i][0] += dp[i - x][1]
            if x != 2:
               dp[i][1] += dp[i - x][0]
         dp[i][0] %= m
         dp[i][1]%= m
   return dp[h][0]

h = 5
blacklist = [2, 1]
print(solve(h, blacklist))

输入

5, [2, 1]

输出

2

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程