在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
- 对于[1,2,3,4]中的每个x,执行以下操作:
- 返回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