动态规划--上楼梯问题

博客内容探讨了两个与楼梯相关的动态规划问题。第一个问题是将军受到鬼魂干扰,只能上或下楼梯,目标是计算在有限次数移动后回到寝室的可能性。第二个问题是一个人可以一步上一层或两层楼梯,求到达第N层的走法数量。博客提供了Python3的实现代码作为解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目1:

题目是偶尔看到的,附链接
打败万恶的ghost以后,将军准备回寝室告诉大伙儿这个消息,没想到杯具又发生了…
你知道有种鬼叫路鬼吗?让人莫名其妙的迷路,将军就被这种鬼上身了。将军本来要上楼梯的,但是因为鬼上身,他要不就上一层楼,要不就下一层楼,这个是随机的,他不能控制自己啦!
假设将军住在第M楼,因为体力原因,将军只能上或者下N次楼,刚开始将军在K楼,假设东6宿舍共有100层。现在问当体力消耗完的时候,将军刚好回到寝室那一层有多少种可能。

例如:将军住在5楼,将军的能上/下5次楼,现在在1楼,
那么将军将回不到寝室啦,为什么?我也不知道。

输入有多组测试数据,每组测试数据共一行,为M,N,K(0 < N < 21,0 < M,K < 101)的值,中间以空格分开,分别代表将军住在第几层,能移动几层和刚开始在第几层; 输出 对应每一组测试数据,输出体力消耗完时将军刚好回到寝室那一层的可能数;

样例输入
44 5 41
样例输出
5

python3 实现
#将军上楼梯问题
M,N,K=44,7,41
res=[[0,0] for i  in range(100)]
#print(res)
res[K-1][0]=1   #定义初始状态
now=1
for i in range(N):
    for j in range(100): 
        if j==0:
            res[j][now]=res[j+1][1-now]
        elif j==99:
            res[j][now]=res[j-1][1-now]
        else: 
            res[j][now]=res[j-1][1-now]+res[j+1][1-now]
    now=1-now
print(res[M-1][1-now])
#输出为21

输出为 21


def callback(M,N,K,count):
    #递归算法
    if N==0 and K==M:
        count.append(1)
    #print(N)
    if K==0 and N>0:
        callback(M,N-1,K+1,count)
    elif K==100 and N>0:
        callback(M,N-1,K-1,count)
    elif N>0:
        callback(M,N-1,K+1,count)
        callback(M,N-1,K-1,count)

def arr(M,N,K):
    #数组记录
    res=[[]for i in range(N)]
    for i in range(N):
        if i==0:
            res[i]=[K-1,K+1]
        else:
            #print("this is",res) #输出最新的res
            for j in range(len(res[i-1])):
                if res[i-1][j]-1>0:
                    res[i].append(res[i-1][j]-1)
                if res[i-1][j]+1<100:
                    res[i].append(res[i-1][j]+1)            
    print(res[-1])
    a=0
    for  i in range(len(res[-1])):
        if  res[-1][i]==M:
            a+=1
    return a
     
if __name__ == "__main__":
    M,N,K= 44,5,41
    count=[]
    callback(M,N,K,count)  #使用递归解法
    print('递归解法输出:',len(count)) 
    b=arr(M,N,K)
    print("数组解法输出:",b)


题目2:

题目:一个人每次只能走一层楼梯或者两层楼梯,从一层开始问走到第N层楼梯一共有多少种方法。

python3 实现
#动态规划解法  此处设N100
def dp(number):
    if number==1:#边界条件
        return 1
    if number==2:#边界条件
        return 2
    result=[1,2]#只存储前2次结果
    count=2
    while count<number:
        next_step=sum(result)
        result=[result[1],next_step]#等同于状态转移方程
        count+=1
    return result[-1]
print(dp(100))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值