蓝跳跳(蓝桥杯

k,p,l

可以理解为一个递归问题,只要解决新问题,老问题之前已经解决了,在这个问题中,我们只要解决第一步怎么走

具体来说,舞台为10,每次最长5,不能连续3,那就是第一步可以为1,2,3,4,5,用d[l][k]记录整个过程。

第一种情况:以小于p的步长走

1:10-1=9,就是还需要解决9步怎么走,那就是d[9],即d[10][1]=d[9]

2:10-2=8,就是还需要解决8步怎么走,那就是d[8],即d[10][2]=d[8]

第二种情况:超过p了

3:第一步走3,已经不小于p,那么下一步就只能是1,2,......p-1步,所以第一步走3,还剩下7,那就是d[7][1]+d[7][2],如果p=5,那就是d[10][3]=d[7][1]+d[7][2]+d[7][3]+d[7][4]

4:第一步走4,不小于p,那么下一步就只能是1,2,......p-1步,所以第一步走4,还剩下6,那就是d[6][1]+d[6][2],即d[10][4]=d[6][1]+d[6][2]

第三种情况:剩余5步且第一步走5步,就只有一种情况,d[10][5]=1

至于d[9][....],d[8][....],d[7][....],d[6][....]是多少,还是按照以上的方法求解

这是一个递归问题,最后的递归出口就是d[1][1]=1

整个分析过程如此,但是代码实现过程,我们要从d[1][....]开始计算,(d[1][1]手动赋值为1),直到d[10][....],最后d[10]就是结果(d[10]表示数组整行的求和)

k, p, L =5, 3, 10

dp = [[0 for index in range(k + 1)] for i in range(L + 1)]
dp[1][1] = 1
for i in range(2, L + 1):
    for j in range(1, k + 1):
        if i == j:
            # 对应第三种情况
            dp[i][j] = 1
        elif j >= p:
            # 对应第二种情况
            for kIndex in range(1, p):
                dp[i][j] += dp[i - j][kIndex]
        else:
            # 对应第一种情况
            dp[i][j] += sum(dp[i - j])
# 整个数组结果
for i in range(L + 1):
    print(dp[i])
# 答案
print(sum(dp[L]) % cst)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值