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)