上楼梯问题--动态规划

题目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))

你可能感兴趣的:(Python,数据结构与算法)